diff --git a/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs b/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs index 161800608..6dcf4e0a3 100644 --- a/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs +++ b/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs @@ -454,12 +454,12 @@ namespace AibisDream return entry; } - public void RestoreSnapshotEntry(TimelineEntrySnapshotDto entry) + public IEnumerator RestoreSnapshotEntryAsync(TimelineEntrySnapshotDto entry) { - if (entry == null) return; + if (entry == null) yield break; gameObject.SetActive(entry.isActive); - if (!entry.isActive || director == null) return; + if (!entry.isActive || director == null) yield break; if (!Enum.TryParse(entry.phase, out var phase)) { @@ -474,7 +474,7 @@ namespace AibisDream case TimelinePlaybackPhase.AtEnd: if (!string.IsNullOrEmpty(entry.loadedAddressableKey)) { - StartCoroutine(RestoreAtEndFromAddressable(entry.loadedAddressableKey)); + yield return RestoreAtEndFromAddressable(entry.loadedAddressableKey); } else { @@ -504,10 +504,63 @@ namespace AibisDream private IEnumerator RestoreAtEndFromAddressable(string addressableKey) { - yield return PlayFromAddressableCoroutine(addressableKey, null); + yield return LoadAddressablePlayable(addressableKey); RestoreAtEndLocal(); } + private IEnumerator LoadAddressablePlayable(string addressableKey) + { + if (director == null) + { + Debug.LogError($"DirectorHandler {timelineName}: PlayableDirector is null"); + yield break; + } + + if (string.IsNullOrEmpty(addressableKey)) + { + Debug.LogError($"DirectorHandler {timelineName}: addressableKey is null or empty"); + yield break; + } + + ReleaseAddressableHandle(); + + var loadKey = TimelinePrefix + addressableKey; + _lastAddressableKey = addressableKey; + PlayableAsset loadedAsset = null; + AsyncOperationHandle loadedHandle = default; + var loadDone = false; + + ResourceKit.LoadAssetAsyncWithHandle(loadKey, handle => + { + loadedHandle = handle; + if (handle.Status == AsyncOperationStatus.Succeeded) + { + loadedAsset = handle.Result; + } + + loadDone = true; + }); + + yield return new WaitUntil(() => loadDone); + + if (loadedAsset == null) + { + Debug.LogError($"DirectorHandler {timelineName}: Failed to load PlayableAsset '{loadKey}'"); + yield break; + } + + CancelPendingResetToStartCoroutine(); + director.stopped -= OnDirectorStopped; + director.Stop(); + + _savedPlayableAsset = director.playableAsset; + director.playableAsset = loadedAsset; + director.RebuildGraph(); + AutoBindCinemachineBrain(); + + _addressableHandle = loadedHandle; + } + /// /// 获取当前播放时间 /// diff --git a/Assets/Scripts/SceneManagement/TimelineKit/TimelineCenter.cs b/Assets/Scripts/SceneManagement/TimelineKit/TimelineCenter.cs index 85851789b..0417aede0 100644 --- a/Assets/Scripts/SceneManagement/TimelineKit/TimelineCenter.cs +++ b/Assets/Scripts/SceneManagement/TimelineKit/TimelineCenter.cs @@ -242,9 +242,9 @@ namespace AibisDream return dto; } - public void RestoreSnapshot(TimelineSnapshotDto dto) + public IEnumerator RestoreSnapshotAsync(TimelineSnapshotDto dto) { - if (dto?.entries == null) return; + if (dto?.entries == null) yield break; foreach (var entry in dto.entries) { @@ -253,7 +253,7 @@ namespace AibisDream continue; } - handler.RestoreSnapshotEntry(entry); + yield return handler.RestoreSnapshotEntryAsync(entry); } } }