using System; using System.Threading.Tasks; using DG.Tweening; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.SceneManagement; 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 { [Title("연출")] [SerializeField] private float _fadeTime = 0.5f; public SceneType CurrentSceneType { get; private set; } private GameObject _fadePanel; private CanvasGroup _fadeCanvasGroup; private Tween _fadeIn; private Tween _fadeOut; protected override void OnAwake() { base.OnAwake(); _fadePanel = transform.Find("Canvas/FadePanel").gameObject; _fadeCanvasGroup = _fadePanel.GetComponent(); } private void Start() { CurrentSceneType = SceneType.Title; _fadePanel.SetActive(false); _fadeCanvasGroup.alpha = 0f; _fadeIn = _fadeCanvasGroup.DOFade(1f, _fadeTime).SetUpdate(true).SetAutoKill(false).Pause(); _fadeOut = _fadeCanvasGroup.DOFade(0f, _fadeTime).SetUpdate(true).SetAutoKill(false).Pause(); } private void OnDestroy() { _fadeIn?.Kill(); _fadeOut?.Kill(); } public async Task FadeIn() { if (_fadeIn == null) { Debug.LogWarning("FadeIn 트윈이 설정되지 않았습니다."); return; } _fadePanel.SetActive(true); _fadeIn.Restart(); await _fadeIn.AsyncWaitForCompletion(); } public async Task FadeOut() { if (_fadeOut == null) { Debug.LogWarning("FadeOut 트윈이 설정되지 않았습니다."); return; } _fadeOut.Restart(); await _fadeOut.AsyncWaitForCompletion(); _fadePanel.SetActive(false); } public async Task ChangeScene(SceneType sceneType) { string changeSceneName; try { changeSceneName = sceneType.ToSceneName(); } catch (ArgumentOutOfRangeException e) { Debug.LogError($"[GameManager] 정의되지 않은 SceneType: {sceneType} - {e.Message}"); return; } await FadeIn(); AsyncOperation loadSceneAsync = SceneManager.LoadSceneAsync(changeSceneName); while (loadSceneAsync is { isDone: false }) await Task.Yield(); // 씬 로딩 후 초기화 작업 CameraManager.Instance.ChangeScene(sceneType); KeyManager.Instance.ChangeScene(sceneType); CurrentSceneType = sceneType; await Task.Delay(1000); await FadeOut(); Debug.Log($"{changeSceneName} 씬으로 전환 완료"); } public void ChangeSceneByIndex(int index) { var sceneType = (SceneType)index; _ = ChangeScene(sceneType); } } }