wip : scenes transitions
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user