diff --git a/packages/org.gamecult.eve.unity-scene/Runtime/EveUnityPlayableWorldClientBootstrap.cs b/packages/org.gamecult.eve.unity-scene/Runtime/EveUnityPlayableWorldClientBootstrap.cs index 0df3769..787181b 100644 --- a/packages/org.gamecult.eve.unity-scene/Runtime/EveUnityPlayableWorldClientBootstrap.cs +++ b/packages/org.gamecult.eve.unity-scene/Runtime/EveUnityPlayableWorldClientBootstrap.cs @@ -89,14 +89,21 @@ namespace GameCult.Eve.UnityScene var navigation = navigable.NavigateAsync(target); StagedPresentation? staged = null; PresentationSwap? swap = null; + Transform? previousRoot = null; + var previousRootWasActive = false; while (!navigation.IsCompleted) yield return null; try { navigation.GetAwaiter().GetResult(); staged = PrepareStagedPresentation(); + previousRoot = sceneRoot; + previousRootWasActive = previousRoot == null || previousRoot.gameObject.activeSelf; + if (previousRoot != null && !ReferenceEquals(previousRoot, transform) && + !ReferenceEquals(previousRoot, staged.SceneRoot)) + previousRoot.gameObject.SetActive(false); navigable.CommitNavigation(); - swap = ActivateStagedPresentation(staged); + swap = ActivateStagedPresentation(staged, previousRootWasActive); navigable.FinalizeNavigation(); swap.Complete(); swap = null; @@ -119,7 +126,10 @@ namespace GameCult.Eve.UnityScene { try { - swap?.Rollback(); + if (swap != null) + swap.Rollback(); + else if (previousRoot != null) + previousRoot.gameObject.SetActive(previousRootWasActive); } catch (Exception rollbackError) { @@ -193,12 +203,13 @@ namespace GameCult.Eve.UnityScene } } - private PresentationSwap ActivateStagedPresentation(StagedPresentation staged) + private PresentationSwap ActivateStagedPresentation( + StagedPresentation staged, + bool previousRootWasActive) { var previousHost = host; var previousRoot = sceneRoot; var previousPresentation = LastPresentation; - var previousRootWasActive = previousRoot == null || previousRoot.gameObject.activeSelf; var input = GetComponent(); var previousInputHost = input?.Host; var previousInputCamera = input?.CameraTransform; @@ -217,9 +228,6 @@ namespace GameCult.Eve.UnityScene host = staged.Host; sceneRoot = staged.SceneRoot; LastPresentation = staged.Presentation; - if (previousRoot != null && !ReferenceEquals(previousRoot, transform) && - !ReferenceEquals(previousRoot, staged.SceneRoot)) - previousRoot.gameObject.SetActive(false); return new PresentationSwap( this, staged, @@ -252,8 +260,6 @@ namespace GameCult.Eve.UnityScene host = previousHost; sceneRoot = previousRoot; LastPresentation = previousPresentation; - if (previousRoot != null) - previousRoot.gameObject.SetActive(previousRootWasActive); throw; } } diff --git a/packages/org.gamecult.eve.unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs b/packages/org.gamecult.eve.unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs index 2cca4a0..27cab25 100644 --- a/packages/org.gamecult.eve.unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs +++ b/packages/org.gamecult.eve.unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs @@ -1172,6 +1172,9 @@ namespace GameCult.Eve.UnityScene.Tests bootstrap.ConfigureProvider(provider); bootstrap.Mount(); var originalHost = bootstrap.Host; + var deactivationRoutes = new List(); + var deactivationProbe = bootstrap.SceneRoot!.gameObject.AddComponent(); + deactivationProbe.Deactivated = () => deactivationRoutes.Add(provider.ActiveRoute); provider.PublishReceipt(new EveUnitySceneCommandReceipt( "receipt:launch", @@ -1198,6 +1201,7 @@ namespace GameCult.Eve.UnityScene.Tests Assert.That(provider.CommitNavigationCount, Is.EqualTo(1)); Assert.That(provider.FinalizeNavigationCount, Is.EqualTo(1)); Assert.That(provider.RollbackNavigationCount, Is.Zero); + Assert.That(deactivationRoutes, Is.EqualTo(new[] { "original" })); provider.PublishReceipt(new EveUnitySceneCommandReceipt( "receipt:launch-again", @@ -3559,5 +3563,15 @@ namespace GameCult.Eve.UnityScene.Tests Reactivated?.Invoke(); } } + + private sealed class NavigationDeactivationProbe : MonoBehaviour + { + public Action? Deactivated { get; set; } + + private void OnDisable() + { + Deactivated?.Invoke(); + } + } } } diff --git a/packages/org.gamecult.eve.unity-scene/package.json b/packages/org.gamecult.eve.unity-scene/package.json index 1276265..d1b717c 100644 --- a/packages/org.gamecult.eve.unity-scene/package.json +++ b/packages/org.gamecult.eve.unity-scene/package.json @@ -1,11 +1,11 @@ { "name": "org.gamecult.eve.unity-scene", "displayName": "Eve Unity Scene Lowering", - "version": "0.3.116", + "version": "0.3.117", "unity": "6000.0", "description": "Provider-agnostic Unity scene shell for gamecult.eve.surface.v1 interactive world surfaces.", "dependencies": { - "org.gamecult.cultlib": "1.0.53", + "org.gamecult.cultlib": "1.0.54", "org.gamecult.eve.plugin-fields": "0.2.3", "org.gamecult.eve.surface": "0.3.3", "org.gamecult.eve.unity-uitoolkit": "0.1.6",