using System; using System.Threading.Tasks; using DG.Tweening; using Sirenix.OdinInspector; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; namespace DDD { public enum SceneType { Title = 0, Restaurant = 1, Voyage = 2 } 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 SceneDefinition : ScriptableObject { } public class SceneManager : Singleton, IManager { public Action OnSceneChanged; public void Init() { // Load Scene Data } public void PostInit() { } public void RequestSceneLoad(Scene sceneToLoad) { //TODO print($"Scene Load : {sceneToLoad.name}"); // onSceneTransitionStarted.Broadcast() } [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 = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(changeSceneName); while (loadSceneAsync is { isDone: false }) await Task.Yield(); // 씬 로딩 후 초기화 작업 CameraManager.Instance.ChangeScene(sceneType); InputManager.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); } } }