ProjectDDD/Assets/_DDD/_Scripts/GameFramework/SceneManager.cs

163 lines
4.3 KiB
C#
Raw Normal View History

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<SceneManager>, IManager
{
2025-07-09 09:45:11 +00:00
public Action<Scene> 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<CanvasGroup>();
// }
// 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);
2025-07-09 09:45:11 +00:00
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);
}
}
}