Unity_개발일지_34

홍신영·2024년 12월 6일
0

Unity

목록 보기
36/62

오늘은 씬 매니저에 대해 알아보겠다.
씬을 이동하고 또 씬 안에 씬을 넣기도 가능하도록 구현할 예정이다.

SceneManager

씬 매니저를 만들어보자.
씬 매니저는 이미 유니티에서 정의하고 있는 클래스이므로 SceneLoadManager라고 이름을 지어주겠다.

씬 매니저는 항상 존재하도록 싱글톤을 상속 받고 DontDestory = true를 해준다.

    protected override void Awake()
    {
        base.Awake();

        nowSceneName = SceneManager.GetActiveScene().name;
        Test();
    }

현재 씬의 이름을 nowSceneName라는 변수로 가져와준다.

이제는 전환을 해보자.

    public async void ChangeScene(string SceneName, Action callback = null, LoadSceneMode loadSceneMode = LoadSceneMode.Single)
    {
        var operation = SceneManager.LoadSceneAsync(SceneName, loadSceneMode);

        while (!operation.isDone)
        {
            Debug.Log("로딩창 띄우기");
            await Task.Yield();
        }

        callback?.Invoke();
    }

async로 비동기 작업을 수행하는 메소드로 만들어주고,
매개변수로 해당 씬의 이름, 콜백, 씬 로드 모드를 받아준다.
그리고 비동기적으로 씬 로드를 해주고, while문을 통해 로드가 되었다면 콜백함수를 호출함으로 씬 로드가 완료되고, 로드가 되기 전까지는 while문을 계속해서 실행하며 로드창을 띄워준다. 지금은 debug로 하고 있지만 추후 수정할 예정이다.

이제 다른 씬을 로드 해보자.
던전 입장을 해보자.
던전씬 스크립트를 작성하고, 위에서 만들어준 씬 로드매니저의 changeScene을 호출하면 된다.

    public void OnExitDungeon()
    {
        SceneLoadManager.Instance.ChangeScene("Game", () =>
        {
            Debug.Log("게임 씬 로드 완료");
        }, UnityEngine.SceneManagement.LoadSceneMode.Single);
    }

위 처럼 씬 이름, 콜백은 현재는 없으므로, 비워두고 디버그만 남겨두자. 그리고 로드 모드를 싱글로 하여 하나의 씬만을 로드하게 된다.
Additive를 사용하면 씬 안에 씬을 로드할 수도 있다.

profile
게임 클라이언트 개발자

0개의 댓글