Scene Controller을 만들기 위해서는 Singleton과 UniTask를 사용해야 합니다.
아래 포스팅에서 '싱글톤'과 'UniTask' 사용방법을 참고해주세요.
Loading Scene을 이용하고 Slider가 있는 경우
using UnityEngine;
using UnityEngine.SceneManagement;
using Cysharp.Threading.Tasks;
using UnityEngine.UI;
public class SceneTransitionController : Singleton<SceneTransitionController>
{
private Slider m_ProgressBar;
private string m_NextScene;
public async UniTask LoadScene(string sceneName)
{
if (SceneManager.GetSceneByName("LoadingScene").isLoaded)
{
SceneManager.UnloadSceneAsync("LoadingScene");
}
SceneManager.LoadScene("LoadingScene");
m_NextScene = sceneName;
await LoadSceneAsync();
}
private async UniTask LoadSceneAsync()
{
await UniTask.Yield();
await UniTask.WaitUntil(() =>
{
m_ProgressBar = FindObjectOfType<Slider>();
return m_ProgressBar != null;
});
AsyncOperation op = SceneManager.LoadSceneAsync(m_NextScene);
op.allowSceneActivation = false;
float timer = 0.0f;
while (!op.isDone)
{
await UniTask.Yield();
timer += Time.deltaTime;
if (op.progress < 0.9f)
{
m_ProgressBar.value = Mathf.Lerp(m_ProgressBar.value, op.progress, op.progress);
if (m_ProgressBar.value >= op.progress)
{
timer = 0f;
}
}
else
{
m_ProgressBar.value = Mathf.Lerp(m_ProgressBar.value, 1f, timer);
if (m_ProgressBar.value == 1.0f)
{
op.allowSceneActivation = true;
return;
}
}
}
SceneManager.LoadScene(m_NextScene);
}
}
Loading Scene을 이용하지 않는 경우
Loading Scene을 이용하지 않는 경우 다른 방식으로 대체할 수 있습니다.
예를 들어, Canvas를 이용해서 다음 씬이 로드되는 동안 화면을 가리는 등의 방식을 사용할 수 있습니다.
using UnityEngine;
using UnityEngine.SceneManagement;
using Cysharp.Threading.Tasks;
using UnityEngine.UI;
public class SceneController : Singleton<SceneController>
{
private string m_NextScene;
public async UniTask LoadScene(string sceneName)
{
m_NextScene = sceneName;
await LoadSceneAsync();
}
private async UniTask LoadSceneAsync()
{
AsyncOperation op = SceneManager.LoadSceneAsync(m_NextScene);
op.allowSceneActivation = false;
while (!op.isDone)
{
await UniTask.Yield();
if (op.progress >= 0.9f)
{
op.allowSceneActivation = true;
}
}
}
}
LoadScene이 호출될 때 CallBack받는 함수를 만들면 될 것 같습니다.