유니티 LoadingScene #Scene Controller

Scene Controller을 만들기 위해서는 Singleton과 UniTask를 사용해야 합니다. 

아래 포스팅에서 '싱글톤' 'UniTask' 사용방법을 참고해주세요.

 

 

두고두고 써먹는 싱글톤(SingleTon) 코드

싱글톤 패턴이란? Unity 싱글톤 패턴은 특정 클래스가 게임 수명 기간 동안 하나의 인스턴스만 갖도록 하기 위해 Unity 게임 개발에서 일반적으로 사용되는 디자인 패턴입니다. 이 패턴은 게임 내

wlsdn629.tistory.com

 

 

유니티 코루틴 대신 unitask

유니티에서 unitask를 사용하기 앞서, 유니티에서 사용하는 코루틴이 무엇인지 알아야 진정한 unitask의 장점을 알 수 있습니다. 지피지기 백전불태 그렇기에 유니티에 기본적으로 내장되어 있는

wlsdn629.tistory.com

 


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받는 함수를 만들면 될 것 같습니다.