GameFlow 및 SceneManager 구조 개선

This commit is contained in:
NTG_Lenovo 2025-07-14 14:57:10 +09:00
parent 5edb192b63
commit 88604b4489
9 changed files with 67 additions and 6 deletions

View File

@ -106,10 +106,7 @@ private async void OpenFlowScene(GameFlowState newFlowState)
{
if (GetFlowScene(newFlowState, out var sceneToLoad))
{
await FadeManager.Instance.FadeOut();
SceneManager.Instance.ActivateScene(sceneToLoad);
await Task.Delay(1000);
await FadeManager.Instance.FadeIn();
await SceneManager.Instance.ActivateScene(sceneToLoad);
}
else
{

View File

@ -0,0 +1,23 @@
using System.Threading.Tasks;
using UnityEngine;
namespace DDD
{
[CreateAssetMenu(fileName = "FadeSceneTransitionHandlerSo", menuName = "GameFramework/FadeSceneTransitionHandlerSo")]
public class FadeSceneTransitionHandlerSo : SceneTransitionHandler
{
[SerializeField]
private float _delayBeforeFadeIn = 1f;
public override async Task OnBeforeSceneActivate(SceneType sceneType)
{
await FadeManager.Instance.FadeOut();
}
public override async Task OnAfterSceneActivate(SceneType sceneType)
{
await Task.Delay((int)(_delayBeforeFadeIn * 1000));
await FadeManager.Instance.FadeIn();
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 703a11d70c312b940b49b9a0f89746d1

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.ResourceManagement.ResourceProviders;
@ -15,10 +16,12 @@ public enum SceneType
public class SceneManager : Singleton<SceneManager>, IManager
{
[SerializeField]
private SceneTransitionHandlerSo _sceneTransitionHandlerSo;
private Dictionary<SceneType, SceneInstance> _loadedScenes;
private SceneInstance _currentSceneInstance;
public Action<SceneInstance> OnSceneChanged;
public void Init()
@ -69,8 +72,13 @@ public async Task PreloadSceneAsync(SceneType sceneType)
}
}
public void ActivateScene(SceneType sceneType)
public async Task ActivateScene(SceneType sceneType)
{
foreach (var handler in _sceneTransitionHandlerSo.Handlers.Where(handler => handler != null))
{
await handler.OnBeforeSceneActivate(sceneType);
}
if (_loadedScenes.TryGetValue(sceneType, out var sceneInstance))
{
foreach (var root in sceneInstance.Scene.GetRootGameObjects())
@ -85,6 +93,11 @@ public void ActivateScene(SceneType sceneType)
{
Debug.LogError($"[SceneManager] Scene not loaded: {sceneType}");
}
foreach (var handler in _sceneTransitionHandlerSo.Handlers.Where(handler => handler != null))
{
await handler.OnAfterSceneActivate(sceneType);
}
}
public void DeactivateScene(SceneType sceneType)

View File

@ -0,0 +1,11 @@
using System.Threading.Tasks;
using UnityEngine;
namespace DDD
{
public abstract class SceneTransitionHandler : ScriptableObject
{
public abstract Task OnBeforeSceneActivate(SceneType sceneType);
public abstract Task OnAfterSceneActivate(SceneType sceneType);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 23db33a4e8a50464e8b57e36db4b0f25

View File

@ -0,0 +1,11 @@
using System.Collections.Generic;
using UnityEngine;
namespace DDD
{
[CreateAssetMenu(fileName = "SceneTransitionHandlerSo", menuName = "GameFramework/SceneTransitionHandlerSo")]
public class SceneTransitionHandlerSo : ScriptableObject
{
public List<SceneTransitionHandler> Handlers = new();
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c8d0f2d4eb3cfdc45a258a64641fe3e8