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를 실행 시키도록 구현하였다.