이번엔 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프로를 진행시켜 씬불러오기를 마친다.