fix(timeline-kit): Addressable Timeline 恢复改为可等待协程

This commit is contained in:
2026-06-22 14:48:43 +08:00
parent 67668f18e0
commit 50566a1d42
2 changed files with 61 additions and 8 deletions
@@ -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<TimelinePlaybackPhase>(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<PlayableAsset> loadedHandle = default;
var loadDone = false;
ResourceKit.LoadAssetAsyncWithHandle<PlayableAsset>(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;
}
/// <summary>
/// 获取当前播放时间
/// </summary>
@@ -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);
}
}
}