Unity Scene Flow 구현

이시율·2025년 7월 7일

Scene 제어를 구현하기 이전에 GameManager에서 state 제어를 먼저 작성하였다.

public void ChangeState(GameState newState)
    {
        if (state == newState) return;
        state = newState;
        OnStateChanged?.Invoke(state);

        switch (state)
        {
            case GameState.Init:
                ChangeState(GameState.MainMenu);
                break;
            case GameState.MainMenu:
                sceneFlowManager.LoadMainScene().Forget();
                break;
            case GameState.Playing:
                Time.timeScale = 1f;
                break;
            case GameState.Paused:
                Time.timeScale = 0f;
                break;
            case GameState.GameOver:
                EventBus.Publish(GameState.GameOver, null);
                break;
            case GameState.Ending:
                sceneFlowManager.LoadEndingScene().Forget();
                break;
        }
    }

state 변경을 통해 Scene을 변경하거나 timeScale, EventBus가 동작하도록 구현.

SceneFlowManager에서는

public async UniTask LoadMainScene()
    {
        // 진행사항 저장

        EventBus.Publish(LoadState.LoadStart, null); // 로딩 화면 시작

        await UniTask.Delay(1000);

        var op = SceneManager.LoadSceneAsync(mainScene.SceneName);

        while (!op.isDone)
        {
            float progress = Mathf.Clamp01(op.progress / 0.9f);

            await UniTask.Yield();
        }

        EventBus.Publish(LoadState.LoadComplete, null); // 로딩 화면 끝
    }

EventBus를 통해 LoadStart Event를 실행 시키고
LoadSceneAsync를 실행 시키도록 구현하였다.

0개의 댓글