diff --git a/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/AnonymousSceneEntryPoint.cs b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/AnonymousSceneEntryPoint.cs index fb0465f..7bbcdbc 100644 --- a/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/AnonymousSceneEntryPoint.cs +++ b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/AnonymousSceneEntryPoint.cs @@ -1,6 +1,7 @@ -using System; +using Cysharp.Threading.Tasks; +using System; +using System.Collections.Generic; using System.Threading; -using Cysharp.Threading.Tasks; namespace MackySoft.Navigathena.SceneManagement.Tests { @@ -16,15 +17,15 @@ public enum SceneEntryPointCallbackFlags OnFinalize = 1 << 3, } - public sealed class SceneEntryPointCallbackFlagsStore + public interface ISceneEntryPointLifecycleListener { - public SceneEntryPointCallbackFlags Value { get; set; } + void OnReceive (SceneEntryPointCallbackFlags flags); } public sealed class AnonymousSceneEntryPoint : SceneEntryPointBase { - SceneEntryPointCallbackFlagsStore m_Flags = new(); + readonly List<ISceneEntryPointLifecycleListener> m_Listeners = new(); Func<ISceneDataReader, IProgress<IProgressDataStore>, CancellationToken, UniTask> m_OnInitialize; Func<ISceneDataReader, CancellationToken, UniTask> m_OnEnter; @@ -44,33 +45,42 @@ public void SetCallbacks ( m_OnFinalize = onFinalize; } - public void RegisterFlags (SceneEntryPointCallbackFlagsStore store) + public void Register (ISceneEntryPointLifecycleListener listener) { - m_Flags = store; + m_Listeners.Add(listener); } protected override UniTask OnInitialize (ISceneDataReader reader, IProgress<IProgressDataStore> progress, CancellationToken cancellationToken) { - m_Flags.Value |= SceneEntryPointCallbackFlags.OnInitialize; + Send(SceneEntryPointCallbackFlags.OnInitialize); return m_OnInitialize?.Invoke(reader, progress, cancellationToken) ?? UniTask.CompletedTask; } protected override UniTask OnEnter (ISceneDataReader reader, CancellationToken cancellationToken) { - m_Flags.Value |= SceneEntryPointCallbackFlags.OnEnter; + Send(SceneEntryPointCallbackFlags.OnEnter); return m_OnEnter?.Invoke(reader, cancellationToken) ?? UniTask.CompletedTask; } protected override UniTask OnExit (ISceneDataWriter writer, CancellationToken cancellationToken) { - m_Flags.Value |= SceneEntryPointCallbackFlags.OnExit; + Send(SceneEntryPointCallbackFlags.OnExit); return m_OnExit?.Invoke(writer, cancellationToken) ?? UniTask.CompletedTask; } protected override UniTask OnFinalize (ISceneDataWriter writer, IProgress<IProgressDataStore> progress, CancellationToken cancellationToken) { - m_Flags.Value |= SceneEntryPointCallbackFlags.OnFinalize; + Send(SceneEntryPointCallbackFlags.OnFinalize); return m_OnFinalize?.Invoke(writer, progress, cancellationToken) ?? UniTask.CompletedTask; } + + void Send (SceneEntryPointCallbackFlags flags) + { + for (int i = 0; i < m_Listeners.Count; i++) + { + ISceneEntryPointLifecycleListener listener = m_Listeners[i]; + listener.OnReceive(flags); + } + } } } \ No newline at end of file diff --git a/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/SceneEntryPointCallbackFlagsStore.cs b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/SceneEntryPointCallbackFlagsStore.cs new file mode 100644 index 0000000..a26a47e --- /dev/null +++ b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/SceneEntryPointCallbackFlagsStore.cs @@ -0,0 +1,12 @@ +namespace MackySoft.Navigathena.SceneManagement.Tests +{ + public sealed class SceneEntryPointCallbackFlagsStore : ISceneEntryPointLifecycleListener + { + public SceneEntryPointCallbackFlags Value { get; private set; } + + void ISceneEntryPointLifecycleListener.OnReceive (SceneEntryPointCallbackFlags flags) + { + Value |= flags; + } + } +} \ No newline at end of file diff --git a/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/SceneEntryPointCallbackFlagsStore.cs.meta b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/SceneEntryPointCallbackFlagsStore.cs.meta new file mode 100644 index 0000000..acb387f --- /dev/null +++ b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/SceneEntryPointCallbackFlagsStore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed4bcdccdb0e6e44c80073da2b4e8f36 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/StandardSceneNavigatorTest.cs b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/StandardSceneNavigatorTest.cs index cb44978..d5d1de2 100644 --- a/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/StandardSceneNavigatorTest.cs +++ b/Assets/MackySoft/MackySoft.Navigathena/Tests/Runtime/SceneManagement/StandardSceneNavigatorTest.cs @@ -48,7 +48,7 @@ public IEnumerator Throw_if_already_initialized () => UniTask.ToCoroutine(async public IEnumerator Push_successfully () => UniTask.ToCoroutine(async () => { SceneEntryPointCallbackFlagsStore flags = new(); - var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene", x => x.RegisterFlags(flags)); + var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene", x => x.Register(flags)); await m_Navigator.Initialize(); await m_Navigator.Push(firstSceneIdentifier); @@ -130,7 +130,7 @@ public IEnumerator Pop_successfully () => UniTask.ToCoroutine(async () => { SceneEntryPointCallbackFlagsStore flags = new(); var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene"); - var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(flags)); + var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(flags)); await m_Navigator.Initialize(); @@ -188,8 +188,8 @@ public IEnumerator Pop_successfully_if_interrupt_pop () => UniTask.ToCoroutine(a SceneEntryPointCallbackFlagsStore secondFlags = new(); SceneEntryPointCallbackFlagsStore thirdFlags = new(); var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene"); - var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(secondFlags)); - var thirdSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("ThirdScene", x => x.RegisterFlags(thirdFlags)); + var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(secondFlags)); + var thirdSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("ThirdScene", x => x.Register(thirdFlags)); await m_Navigator.Initialize(); @@ -221,7 +221,7 @@ public IEnumerator Change_successfully () => UniTask.ToCoroutine(async () => { SceneEntryPointCallbackFlagsStore flags = new(); var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene"); - var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(flags)); + var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(flags)); await m_Navigator.Initialize(); @@ -239,7 +239,7 @@ public IEnumerator Change_successfully_if_interrupt_change () => UniTask.ToCorou { SceneEntryPointCallbackFlagsStore secondFlags = new(); var firstSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("FirstScene"); - var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.RegisterFlags(secondFlags)); + var secondSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("SecondScene", x => x.Register(secondFlags)); var thirdSceneIdentifier = new BlankSceneIdentifier<AnonymousSceneEntryPoint>("ThirdScene"); await m_Navigator.Initialize();