Unity

로딩 구현하기

박도치 2023. 12. 28. 21:42

게임을 플레이하는 입장에서는 답답한게 로딩이지만, 게임 내 오브젝트나 내용들을 배치하는 시간을 어느정도 벌어주는 것이 바로 로딩의 역할이다.

 

그렇다면 이 로딩은 어떻게 구현할 수 있을까?

 

 

간단한 로딩 구현하기

 

먼저 백그라운드 이미지와, 비어있는 이미지 가득 차 있는 이미지를 준비하여 fillamount를 통해 가득 차 있는 듯한 표현을 해준다.

 

 

 

fillamount 는 0 으로 해준 후 스크립트를 생성해준다.

 

LoadingSceneController.cs

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LoadingSceneController : MonoBehaviour
{
    static string nextScene;

    [SerializeField] Image progressBar;

    public static void LoadScene(string sceneName)
    {
        nextScene = sceneName;
        SceneManager.LoadScene("LoadingScene");
    }

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(LoadSceneProcess());
    }

    IEnumerator LoadSceneProcess()
    {
        AsyncOperation op = SceneManager.LoadSceneAsync(nextScene); // 일반 LoadScene은 비동기가 아니기 때문에 로드하는 동안 어떠한 행동도 할 수 없음
        op.allowSceneActivation = false; // 씬을 비동기로 불러올 때 씬의 로딩이 끝나면 자동으로 불러온 씬을 이동할 것인지를 설정, false 면 90퍼센트에서 씬이 넘어가지 않고 대기

        float timer = 0f;
        while (!op.isDone)
        {
            yield return null; // 반복문이 돌 때 마다 제어권을 넘겨줌

            if(op.progress < 0.9f) // 90퍼까지 차기 때문에 90퍼보다 낮으면 
            {
                progressBar.fillAmount =op.progress;
            }
            else
            // 페이크 로딩으로 조금씩 채워줌
            {
                timer += Time.unscaledDeltaTime;
                progressBar.fillAmount = Mathf.Lerp(0.9f, 1f, timer);
                // 다 채우면 true로 변환
                if(progressBar.fillAmount >= 1f)
                {
                    op.allowSceneActivation = true;
                    yield break;
                }

            }
        }

    }

}

 

 

Static으로 선언하여 어디서든 가져올 수 있게끔 해주며, LoadScene에 이동할 Scene을 넣어서 어떤 행동을 했을 때 LoadScene을 호출하여 로딩이 되게끔 해준다.

 

아래는 코루틴인데 씬을 비동기(LoadSceneAsync)로 이동시켜주며, 이는 로딩하는 동안 어떠한 작업도 못하는 것을 방지하여 로딩하는 동안 지루하지 않게 애니메이션이나, 문구 등을 띄워주기 위함이다.

 

allowSceneActivation 을 false로 두게 되면 씬의 로딩이 끝났을 때 자동으로 씬을 불러오지 않게 되는데, true로 둬도 괜찮지만 생각보다 로딩의 속도가 빠르기도 하고, 진행이 다 되지 않았는데 로딩이 끝나버릴수도 있기 때문에 false로 한다고 한다.

 

그래서 false로 두게되면 90퍼센트 정도 차게 되는데 그래서 아래 if문에서 0.9f 까지 fillamount를 해주는 거고 이후에는 timer로 조금씩 채워주는 페이크로딩을 해주게 된다.

 

 

적용

프로젝트에서 게임시작 버튼을 누르게 되면 씬을 이동하게 할 예정인데 그렇다면 onclick 이벤트에서 해당 LoadScene 함수를 불러 로딩을 표현해주면 된다.

 

LoadMainScene.cs

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LoadMainScene : MonoBehaviour
{
    private Button gameStartButton;

    private void Awake()
    {
        gameStartButton = GetComponent<Button>();
    }

    void Start()
    {
        LoginLoadSceneButtonEvent();
    }

    private void LoginLoadSceneButtonEvent()
    {
        gameStartButton.onClick.AddListener(() => { LoadingSceneController.LoadScene("MainScene"); });
    }
}

 

static으로 되어있기 때문에 이렇게 호출할 수 있으며 버튼에 cs를 담아 버튼이 클릭됐을 때 로딩 이후에 MainScene으로 이동하게 된다.

 

'Unity' 카테고리의 다른 글

AddForce()  (0) 2024.01.03
유니티 수학 Mathf.Sin()과 Quaternion.Lerp()  (0) 2024.01.02
[FSM] 플레이어 상태머신 (2)  (0) 2023.12.27
[FSM] 플레이어 StateMachine 만들어보기  (1) 2023.12.26
[Unity] FSM (유한 상태 기계)  (2) 2023.12.22