diff --git a/Assets/_DDD/_Scripts/GameFlow/GameFlowManager.cs b/Assets/_DDD/_Scripts/GameFlow/GameFlowManager.cs index 6ad63d9ca..a60d6aaf6 100644 --- a/Assets/_DDD/_Scripts/GameFlow/GameFlowManager.cs +++ b/Assets/_DDD/_Scripts/GameFlow/GameFlowManager.cs @@ -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 { diff --git a/Assets/_DDD/_Scripts/GameFramework/Scene/FadeSceneTransitionHandlerSo.cs b/Assets/_DDD/_Scripts/GameFramework/Scene/FadeSceneTransitionHandlerSo.cs new file mode 100644 index 000000000..ed8a033cb --- /dev/null +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/FadeSceneTransitionHandlerSo.cs @@ -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(); + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameFramework/Scene/FadeSceneTransitionHandlerSo.cs.meta b/Assets/_DDD/_Scripts/GameFramework/Scene/FadeSceneTransitionHandlerSo.cs.meta new file mode 100644 index 000000000..d5e49e45f --- /dev/null +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/FadeSceneTransitionHandlerSo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 703a11d70c312b940b49b9a0f89746d1 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameFramework/SceneManager.cs b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneManager.cs similarity index 84% rename from Assets/_DDD/_Scripts/GameFramework/SceneManager.cs rename to Assets/_DDD/_Scripts/GameFramework/Scene/SceneManager.cs index 78a7f7e84..ef559c9d9 100644 --- a/Assets/_DDD/_Scripts/GameFramework/SceneManager.cs +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneManager.cs @@ -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, IManager { + [SerializeField] + private SceneTransitionHandlerSo _sceneTransitionHandlerSo; + private Dictionary _loadedScenes; private SceneInstance _currentSceneInstance; - public Action 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) diff --git a/Assets/_DDD/_Scripts/GameFramework/SceneManager.cs.meta b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneManager.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/GameFramework/SceneManager.cs.meta rename to Assets/_DDD/_Scripts/GameFramework/Scene/SceneManager.cs.meta diff --git a/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandler.cs b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandler.cs new file mode 100644 index 000000000..7dce93b25 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandler.cs @@ -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); + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandler.cs.meta b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandler.cs.meta new file mode 100644 index 000000000..53eb1a1d7 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 23db33a4e8a50464e8b57e36db4b0f25 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandlerSo.cs b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandlerSo.cs new file mode 100644 index 000000000..8e27b2ba7 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandlerSo.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace DDD +{ + [CreateAssetMenu(fileName = "SceneTransitionHandlerSo", menuName = "GameFramework/SceneTransitionHandlerSo")] + public class SceneTransitionHandlerSo : ScriptableObject + { + public List Handlers = new(); + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandlerSo.cs.meta b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandlerSo.cs.meta new file mode 100644 index 000000000..836b515f4 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameFramework/Scene/SceneTransitionHandlerSo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c8d0f2d4eb3cfdc45a258a64641fe3e8 \ No newline at end of file