Keep navigation shutdown on the outgoing Verse
This commit is contained in:
parent
909ce43727
commit
2fd5f4bbb9
3 changed files with 31 additions and 11 deletions
|
|
@ -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<EveUnityPlayableWorldInputDriver>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1172,6 +1172,9 @@ namespace GameCult.Eve.UnityScene.Tests
|
|||
bootstrap.ConfigureProvider(provider);
|
||||
bootstrap.Mount();
|
||||
var originalHost = bootstrap.Host;
|
||||
var deactivationRoutes = new List<string>();
|
||||
var deactivationProbe = bootstrap.SceneRoot!.gameObject.AddComponent<NavigationDeactivationProbe>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Reference in a new issue