diff --git a/Assets/YooAsset/Samples~/UniTask Sample/UniTask/Runtime/External/YooAsset/OperationHandleBaseExtensions.cs b/Assets/YooAsset/Samples~/UniTask Sample/UniTask/Runtime/External/YooAsset/OperationHandleBaseExtensions.cs index 06e5b07..580d5d7 100644 --- a/Assets/YooAsset/Samples~/UniTask Sample/UniTask/Runtime/External/YooAsset/OperationHandleBaseExtensions.cs +++ b/Assets/YooAsset/Samples~/UniTask Sample/UniTask/Runtime/External/YooAsset/OperationHandleBaseExtensions.cs @@ -12,12 +12,12 @@ namespace Cysharp.Threading.Tasks { public static class OperationHandleBaseExtensions { - public static UniTask.Awaiter GetAwaiter(this OperationHandleBase handle) + public static UniTask.Awaiter GetAwaiter(this HandleBase handle) { return ToUniTask(handle).GetAwaiter(); } - public static UniTask ToUniTask(this OperationHandleBase handle, + public static UniTask ToUniTask(this HandleBase handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update) { @@ -54,15 +54,15 @@ namespace Cysharp.Threading.Tasks TaskPool.RegisterSizeGetter(typeof(OperationHandleBaserConfiguredSource), () => pool.Size); } - private readonly Action continuationAction; - private OperationHandleBase handle; + private readonly Action continuationAction; + private HandleBase handle; private IProgress progress; private bool completed; private UniTaskCompletionSourceCore core; OperationHandleBaserConfiguredSource() { continuationAction = Continuation; } - public static IUniTaskSource Create(OperationHandleBase handle, + public static IUniTaskSource Create(HandleBase handle, PlayerLoopTiming timing, IProgress progress, out short token) @@ -83,40 +83,46 @@ namespace Cysharp.Threading.Tasks } // BUG 在 Unity 2020.3.36 版本测试中, IL2Cpp 会报 如下错误 - // BUG ArgumentException: Incompatible Delegate Types. First is System.Action`1[[YooAsset.AssetOperationHandle, YooAsset, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]] second is System.Action`1[[YooAsset.OperationHandleBase, YooAsset, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]] + // BUG ArgumentException: Incompatible Delegate Types. First is System.Action`1[[YooAsset.AssetHandle, YooAsset, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]] second is System.Action`1[[YooAsset.OperationHandleBase, YooAsset, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]] // BUG 也可能报的是 Action '1' Action '1' 的 InvalidCastException // BUG 此处不得不这么修改, 如果后续 Unity 修复了这个问题, 可以恢复之前的写法 #if UNITY_2020_BUG switch(handle) { - case AssetOperationHandle asset_handle: + case AssetHandle asset_handle: asset_handle.Completed += result.AssetContinuation; break; - case SceneOperationHandle scene_handle: + case SceneHandle scene_handle: scene_handle.Completed += result.SceneContinuation; break; - case SubAssetsOperationHandle sub_asset_handle: + case SubAssetsHandle sub_asset_handle: sub_asset_handle.Completed += result.SubContinuation; break; - case RawFileOperationHandle raw_file_handle: + case RawFileHandle raw_file_handle: raw_file_handle.Completed += result.RawFileContinuation; break; + case AllAssetsHandle all_assets_handle: + all_assets_handle.Completed += result.AllAssetsContinuation; + break; } #else switch (handle) { - case AssetOperationHandle asset_handle: + case AssetHandle asset_handle: asset_handle.Completed += result.continuationAction; break; - case SceneOperationHandle scene_handle: + case SceneHandle scene_handle: scene_handle.Completed += result.continuationAction; break; - case SubAssetsOperationHandle sub_asset_handle: + case SubAssetsHandle sub_asset_handle: sub_asset_handle.Completed += result.continuationAction; break; - case RawFileOperationHandle raw_file_handle: + case RawFileHandle raw_file_handle: raw_file_handle.Completed += result.continuationAction; break; + case AllAssetsHandle all_assets_handle: + all_assets_handle.Completed += result.continuationAction; + break; } #endif token = result.core.Version; @@ -124,29 +130,35 @@ namespace Cysharp.Threading.Tasks return result; } #if UNITY_2020_BUG - private void AssetContinuation(AssetOperationHandle handle) + private void AssetContinuation(AssetHandle handle) { handle.Completed -= AssetContinuation; BaseContinuation(); } - private void SceneContinuation(SceneOperationHandle handle) + private void SceneContinuation(SceneHandle handle) { handle.Completed -= SceneContinuation; BaseContinuation(); } - private void SubContinuation(SubAssetsOperationHandle handle) + private void SubContinuation(SubAssetsHandle handle) { handle.Completed -= SubContinuation; BaseContinuation(); } - private void RawFileContinuation(RawFileOperationHandle handle) + private void RawFileContinuation(RawFileHandle handle) { handle.Completed -= RawFileContinuation; BaseContinuation(); } + + private void AllAssetsContinuation(AllAssetsHandle handle) + { + handle.Completed -= AllAssetsContinuation; + BaseContinuation(); + } #endif [MethodImpl(MethodImplOptions.AggressiveInlining)] private void BaseContinuation() @@ -169,22 +181,25 @@ namespace Cysharp.Threading.Tasks } } - private void Continuation(OperationHandleBase _) + private void Continuation(HandleBase _) { switch(handle) { - case AssetOperationHandle asset_handle: + case AssetHandle asset_handle: asset_handle.Completed -= continuationAction; break; - case SceneOperationHandle scene_handle: + case SceneHandle scene_handle: scene_handle.Completed -= continuationAction; break; - case SubAssetsOperationHandle sub_asset_handle: + case SubAssetsHandle sub_asset_handle: sub_asset_handle.Completed -= continuationAction; break; - case RawFileOperationHandle raw_file_handle: + case RawFileHandle raw_file_handle: raw_file_handle.Completed -= continuationAction; break; + case AllAssetsHandle all_assets_handle: + all_assets_handle.Completed -= continuationAction; + break; } BaseContinuation();