From 50566a1d428e85e5f8e7e7bcacd94c1dfd3cbbc4 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 22 Jun 2026 14:48:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(timeline-kit):=20Addressable=20Timeline=20?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E6=94=B9=E4=B8=BA=E5=8F=AF=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E5=8D=8F=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimelineKit/DirectorHandler.cs | 63 +++++++++++++++++-- .../TimelineKit/TimelineCenter.cs | 6 +- 2 files changed, 61 insertions(+), 8 deletions(-) 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); } } }