fix(timeline-kit): Addressable Timeline 恢复改为可等待协程
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user