wip : scenes transitions

This commit is contained in:
2026-07-17 18:30:24 +02:00
parent 6dd3db9a07
commit 50f65e99a7
23 changed files with 915 additions and 1171 deletions
@@ -3,6 +3,7 @@ using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using OctoCore.Navigation.Data;
using OctoCore.Transitions;
#if OCTO_ADDRESSABLES
using UnityEngine.AddressableAssets;
@@ -50,7 +51,6 @@ namespace OctoCore.Navigation
public Action<OctoTeleporterData, OctoTeleporterData> OnTeleportCompleted;
private Coroutine _loadingCoroutine;
private OctoSceneFade _fadeCanvas;
private bool _setPlayerRotation;
public void Init(OctoSettings settings)
@@ -66,8 +66,11 @@ namespace OctoCore.Navigation
}
}
// Create fade canvas
CreateFadeCanvas();
// The concrete transition effect (eyelid blink, plain fade, etc.) lives outside
// this package and registers itself with OctoTransitionProvider at runtime.
// Nothing to instantiate here.
if (OctoTransitionProvider.Current == null)
Debug.LogWarning("[OctoNavigation] No IOctoSceneTransition registered with OctoTransitionProvider. Scene transitions will have no visual effect.");
if (OctoEvents.Instance)
OctoEvents.Instance.SetScenesInitialized();
@@ -136,18 +139,63 @@ namespace OctoCore.Navigation
}
}
/// <summary>
/// Resolves the video clip to use for a transition: the scene/teleporter's own
/// clip if assigned, otherwise the global default from FadeSettings.
/// </summary>
private UnityEngine.Video.VideoClip ResolveClip(UnityEngine.Video.VideoClip specific, OctoSettings.ScenesSettings.FadeTransitionSettings fadeSettings)
{
return specific != null ? specific : fadeSettings.DefaultTransitionClip;
}
/// <summary>
/// Resolves the material to use for a transition: the scene/teleporter's own
/// material if assigned, otherwise the global default from FadeSettings.
/// </summary>
private Material ResolveMaterial(Material specific, OctoSettings.ScenesSettings.FadeTransitionSettings fadeSettings)
{
return specific != null ? specific : fadeSettings.DefaultTransitionMaterial;
}
/// <summary>
/// Waits for IOctoSceneTransition.CloseEyes() to complete. Bridges the callback-based
/// transition API with this class's coroutine-based flow.
/// </summary>
private IEnumerator CloseEyesRoutine(IOctoSceneTransition transition, float duration)
{
bool done = false;
transition.CloseEyes(duration, () => done = true);
while (!done)
yield return null;
}
/// <summary>
/// Waits for IOctoSceneTransition.OpenEyes() to complete. Bridges the callback-based
/// transition API with this class's coroutine-based flow.
/// </summary>
private IEnumerator OpenEyesRoutine(IOctoSceneTransition transition, float duration)
{
bool done = false;
transition.OpenEyes(duration, () => done = true);
while (!done)
yield return null;
}
private IEnumerator LoadSceneCoroutine(OctoSceneData sceneData)
{
OnSceneLoadStarted?.Invoke(sceneData);
// Get global fade settings
OctoSettings.ScenesSettings.FadeTransitionSettings fadeSettings = OctoCore.Instance.Settings.Scenes.FadeSettings;
IOctoSceneTransition transition = OctoTransitionProvider.Current;
// Fade out
if (sceneData.UseFadeTransition && _fadeCanvas)
if (sceneData.UseFadeTransition && transition != null)
{
_fadeCanvas.FadeOut(fadeSettings.FadeOutDuration, fadeSettings.FadeColor);
yield return new WaitForSeconds(fadeSettings.FadeOutDuration);
transition.SetClip(ResolveClip(sceneData.TransitionClip, fadeSettings), ResolveMaterial(sceneData.TransitionMaterial, fadeSettings));
yield return CloseEyesRoutine(transition, fadeSettings.FadeOutDuration);
transition.ShowVideoAfterDelay(0f);
yield return new WaitForSeconds(fadeSettings.HoldClosedDuration);
}
// Check if using Addressables
@@ -165,10 +213,10 @@ namespace OctoCore.Navigation
}
// Fade in
if (sceneData.UseFadeTransition && _fadeCanvas)
if (sceneData.UseFadeTransition && transition != null)
{
_fadeCanvas.FadeIn(fadeSettings.FadeInDuration);
yield return new WaitForSeconds(fadeSettings.FadeInDuration);
yield return OpenEyesRoutine(transition, fadeSettings.FadeInDuration);
transition.HideVideo();
}
OnSceneLoadCompleted?.Invoke(sceneData);
@@ -200,12 +248,15 @@ namespace OctoCore.Navigation
{
// Get global fade settings
OctoSettings.ScenesSettings.FadeTransitionSettings fadeSettings = OctoCore.Instance.Settings.Scenes.FadeSettings;
IOctoSceneTransition transition = OctoTransitionProvider.Current;
// Fade out
if (teleporter.UseFadeTransition && _fadeCanvas)
if (teleporter.UseFadeTransition && transition != null)
{
_fadeCanvas.FadeOut(fadeSettings.FadeOutDuration, fadeSettings.FadeColor);
yield return new WaitForSeconds(fadeSettings.FadeOutDuration);
transition.SetClip(ResolveClip(teleporter.TransitionClip, fadeSettings), ResolveMaterial(teleporter.TransitionMaterial, fadeSettings));
yield return CloseEyesRoutine(transition, fadeSettings.FadeOutDuration);
transition.ShowVideoAfterDelay(0f);
yield return new WaitForSeconds(fadeSettings.HoldClosedDuration);
}
// Find target teleporter
@@ -222,10 +273,10 @@ namespace OctoCore.Navigation
}
// Fade in
if (teleporter.UseFadeTransition && _fadeCanvas)
if (teleporter.UseFadeTransition && transition != null)
{
_fadeCanvas.FadeIn(fadeSettings.FadeInDuration);
yield return new WaitForSeconds(fadeSettings.FadeInDuration);
yield return OpenEyesRoutine(transition, fadeSettings.FadeInDuration);
transition.HideVideo();
}
OnTeleportCompleted?.Invoke(null, teleporter);
@@ -235,12 +286,15 @@ namespace OctoCore.Navigation
{
// Get global fade settings
OctoSettings.ScenesSettings.FadeTransitionSettings fadeSettings = OctoCore.Instance.Settings.Scenes.FadeSettings;
IOctoSceneTransition transition = OctoTransitionProvider.Current;
// Fade out
if (teleporter.UseFadeTransition && _fadeCanvas)
if (teleporter.UseFadeTransition && transition != null)
{
_fadeCanvas.FadeOut(fadeSettings.FadeOutDuration, fadeSettings.FadeColor);
yield return new WaitForSeconds(fadeSettings.FadeOutDuration);
transition.SetClip(ResolveClip(teleporter.TransitionClip, fadeSettings), ResolveMaterial(teleporter.TransitionMaterial, fadeSettings));
yield return CloseEyesRoutine(transition, fadeSettings.FadeOutDuration);
transition.ShowVideoAfterDelay(0f);
yield return new WaitForSeconds(fadeSettings.HoldClosedDuration);
}
// Store pending teleporter
@@ -296,12 +350,13 @@ namespace OctoCore.Navigation
// Get global fade settings
OctoSettings.ScenesSettings.FadeTransitionSettings fadeSettings = OctoCore.Instance.Settings.Scenes.FadeSettings;
IOctoSceneTransition transition = OctoTransitionProvider.Current;
// Fade in
if (_fadeCanvas)
if (transition != null)
{
_fadeCanvas.FadeIn(fadeSettings.FadeInDuration);
yield return new WaitForSeconds(fadeSettings.FadeInDuration);
yield return OpenEyesRoutine(transition, fadeSettings.FadeInDuration);
transition.HideVideo();
}
OnTeleportCompleted?.Invoke(null, teleporter.TeleporterData);
@@ -321,13 +376,5 @@ namespace OctoCore.Navigation
OctoTeleporterProxy.Instance.Teleport(teleporter.transform.position);
}
}
private void CreateFadeCanvas()
{
GameObject fadeObj = new GameObject("OctoSceneFade");
GameObject.DontDestroyOnLoad(fadeObj);
_fadeCanvas = fadeObj.AddComponent<OctoSceneFade>();
_fadeCanvas.Initialize();
}
}
}