GameFlow 및 SceneManager 구조 개선
This commit is contained in:
parent
5edb192b63
commit
88604b4489
@ -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
|
||||
{
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 703a11d70c312b940b49b9a0f89746d1
|
@ -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)
|
@ -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);
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23db33a4e8a50464e8b57e36db4b0f25
|
@ -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();
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8d0f2d4eb3cfdc45a258a64641fe3e8
|
Loading…
Reference in New Issue
Block a user