[Unity] Loading화면 만들기

조팽이·2024년 3월 28일

Unity

목록 보기
4/13

이번엔 Scene간 전환에서 사용되는 Loading화면에 관한 이야기를 하겠다.

유니티에선 비동기적방식으로 로딩을 진행할 수 있는데 비동기적방식이란 어떤 작업이 끝날때 까지 기다리지 않고 다른 작업을 동시에 실행하는 방식을 말한다.
즉 다른 씬을 불러오면서 로딩화면 띄우기에 아주 좋은 방식이다.


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

public class LoadingScene : MonoBehaviour {
    public Slider progerssBar;
    public static void LoadScene() {
        SceneManager.LoadScene(0);
    }

    void Start()
    {
        StartCoroutine(LoadSceneProcess());
    }

    IEnumerator LoadSceneProcess() {
        AsyncOperation op = SceneManager.LoadSceneAsync(0);
        op.allowSceneActivation = false;

        float timer = 0f;
        while (!op.isDone) {
            yield return null;

            if(op.progress < 0.9f) {
                progerssBar.value = op.progress;
            }
            else {
                timer += Time.unscaledDeltaTime;
                progerssBar.value = Mathf.Lerp(0.9f, 1f, timer);
                if(progerssBar.value >= 1f) {
                    op.allowSceneActivation = true;
                    yield break;
                }
            }

        }
        
        
    }
    
}

다음 코드 중에서

 		AsyncOperation op = SceneManager.LoadSceneAsync(0);
        op.allowSceneActivation = false;

을 살펴보자.

 		AsyncOperation op = SceneManager.LoadSceneAsync(0);

은 0번째 scene을 비동기적방식으로 불러오겠다는 의미이다.

        op.allowSceneActivation = false;

allowSceneActivation이 false면 씬 불러오기 진행도의 90퍼센트까지만 진행되고 씬 불러오기가 멈춘다. allowSceneActivation을 다시 true로 바꿔주면 나머지 10퍼센트가 진행되어 씬 불러오기가 완료된다.

        while (!op.isDone) {
            yield return null;

            if(op.progress < 0.9f) {
                progerssBar.value = op.progress;
            }
            else {
                timer += Time.unscaledDeltaTime;
                progerssBar.value = Mathf.Lerp(0.9f, 1f, timer);
                if(progerssBar.value >= 1f) {
                    op.allowSceneActivation = true;
                    yield break;
                }
            }

        }

코루틴을 사용해 씬을 불러들이면서도 slider바를 채웠다.
op.isDone은 Scene불러오기가 끝났는지를 나타내며, op.progress는 진행도를 나타낸다. 진행도가 0.9f미만일 때 미리 받아놓은 slider의 value를 진행도와 일치시켰다.
진행도가 0.9가 되면(op.allowSceneActivation이 false여서 0.9에서 멈춘다.) silder바를 끝까지 Lerp를 통해 채우고 끝까지 찼다면 op.allowSceneActivation을 true로 바꿔 나머지 진행상황10프로를 진행시켜 씬불러오기를 마친다.

profile
게임개발자

0개의 댓글