using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.Serialization; namespace DDD { public enum SceneType { Title = 0, Restaurant = 1 } public static class SceneTypeExtensions { public static string ToSceneName(this SceneType sceneType) { return sceneType switch { SceneType.Title => "00.Title", SceneType.Restaurant => "01.Restaurant", _ => throw new ArgumentOutOfRangeException(nameof(sceneType), sceneType, null) }; } } public class GameManager : Singleton { public SceneType CurrentSceneType { get; private set; } private void Start() { CurrentSceneType = SceneType.Title; } public async Task ChangeScene(SceneType sceneType) { string changeSceneName; try { changeSceneName = sceneType.ToSceneName(); } catch (ArgumentOutOfRangeException e) { Debug.LogError($"[GameManager] 정의되지 않은 SceneType: {sceneType} - {e.Message}"); return; } await UiManager.Instance.FadeIn(); AsyncOperation loadSceneAsync = SceneManager.LoadSceneAsync(changeSceneName, LoadSceneMode.Additive); while (loadSceneAsync is { isDone: false }) await Task.Yield(); // 씬 로딩 후 초기화 작업 UiManager.Instance.ChangeScene(CurrentSceneType, sceneType); CameraManager.Instance.ChangeScene(sceneType); KeyManager.Instance.ChangeScene(sceneType); CurrentSceneType = sceneType; await Task.Delay(1000); await UiManager.Instance.FadeOut(); Debug.Log($"{changeSceneName} 씬으로 전환 완료"); } public void ChangeSceneByIndex(int index) { var sceneType = (SceneType)index; _ = ChangeScene(sceneType); } } }