From 2d8eb8b9204a8279988de59a46d59a5bbde0081c Mon Sep 17 00:00:00 2001 From: Gabriele Picco Date: Sun, 12 Nov 2023 22:12:27 +0100 Subject: [PATCH] :sparkles: Improve WebSocket connections (#186) * :sparkles: Add OnWebSocketConnect event * :sparkles: Add localnet Cluster with default rpc and streaming endpoint * :arrow_up: Update UniTask * :arrow_up: Upgrade NativeWebSocket * :arrow_up: Upgrade Packages/Solana.Unity.Rpc * :fire: Remove uneeded dispacther * :sparkles: Use processed commitment for faster updates * :recycle: Update example * :recycle: Code Refactor --- Packages/NativeWebSocket.dll | Bin 20992 -> 19968 bytes Packages/NativeWebSocket.dll.meta | 3 +- Packages/Solana.Unity.Rpc.dll | Bin 199168 -> 199168 bytes Runtime/Plugins/UniTask/Editor.meta | 2 +- .../UniTask/Editor/SplitterGUILayout.cs.meta | 2 +- .../UniTask/Editor/UniTask.Editor.asmdef.meta | 2 +- .../Editor/UniTaskTrackerTreeView.cs.meta | 2 +- .../Editor/UniTaskTrackerWindow.cs.meta | 2 +- Runtime/Plugins/UniTask/Runtime.meta | 2 +- .../Plugins/UniTask/Runtime/AsyncLazy.cs.meta | 2 +- .../Runtime/AsyncReactiveProperty.cs.meta | 2 +- .../Plugins/UniTask/Runtime/AsyncUnit.cs.meta | 2 +- .../CancellationTokenEqualityComparer.cs.meta | 2 +- .../CancellationTokenExtensions.cs.meta | 2 +- .../CancellationTokenSourceExtensions.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Channel.cs.meta | 2 +- .../UniTask/Runtime/CompilerServices.meta | 2 +- .../AsyncMethodBuilderAttribute.cs.meta | 2 +- .../AsyncUniTaskMethodBuilder.cs.meta | 2 +- .../AsyncUniTaskVoidMethodBuilder.cs.meta | 2 +- .../StateMachineRunner.cs.meta | 2 +- .../Runtime/EnumerableAsyncExtensions.cs.meta | 2 +- .../Runtime/EnumeratorAsyncExtensions.cs.meta | 2 +- .../Runtime/ExceptionExtensions.cs.meta | 2 +- Runtime/Plugins/UniTask/Runtime/External.meta | 2 +- .../Runtime/External/Addressables.meta | 2 +- .../AddressablesAsyncExtensions.cs | 44 ++- .../AddressablesAsyncExtensions.cs.meta | 2 +- .../UniTask.Addressables.asmdef.meta | 2 +- .../UniTask/Runtime/External/DOTween.meta | 2 +- .../DOTween/DOTweenAsyncExtensions.cs | 146 ++++----- .../DOTween/DOTweenAsyncExtensions.cs.meta | 2 +- .../DOTween/UniTask.DOTween.asmdef.meta | 2 +- .../UniTask/Runtime/External/TextMeshPro.meta | 2 +- ...tMeshProAsyncExtensions.InputField.cs.meta | 2 +- .../TextMeshProAsyncExtensions.cs.meta | 2 +- .../UniTask.TextMeshPro.asmdef.meta | 2 +- .../Runtime/IUniTaskAsyncEnumerable.cs.meta | 2 +- .../UniTask/Runtime/IUniTaskSource.cs.meta | 2 +- Runtime/Plugins/UniTask/Runtime/Internal.meta | 2 +- .../Runtime/Internal/ArrayPool.cs.meta | 2 +- .../Runtime/Internal/ArrayPoolUtil.cs.meta | 2 +- .../Runtime/Internal/ArrayUtil.cs.meta | 2 +- .../Internal/ContinuationQueue.cs.meta | 2 +- .../Internal/DiagnosticsExtensions.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Internal/Error.cs | 2 +- .../UniTask/Runtime/Internal/Error.cs.meta | 2 +- .../Runtime/Internal/MinimumQueue.cs.meta | 2 +- .../Runtime/Internal/PlayerLoopRunner.cs.meta | 2 +- .../Runtime/Internal/PooledDelegate.cs.meta | 2 +- .../RuntimeHelpersAbstraction.cs.meta | 2 +- .../Runtime/Internal/StatePool.cs.meta | 2 +- .../Runtime/Internal/TaskTracker.cs.meta | 2 +- .../Internal/UnityEqualityComparer.cs.meta | 2 +- .../UnityWebRequestExtensions.cs.meta | 2 +- .../Runtime/Internal/ValueStopwatch.cs.meta | 2 +- .../Runtime/Internal/WeakDictionary.cs.meta | 2 +- Runtime/Plugins/UniTask/Runtime/Linq.meta | 2 +- .../UniTask/Runtime/Linq/Aggregate.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/All.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Any.cs.meta | 2 +- .../Runtime/Linq/AppendPrepend.cs.meta | 2 +- .../Linq/AsUniTaskAsyncEnumerable.cs.meta | 2 +- .../Runtime/Linq/AsyncEnumeratorBase.cs.meta | 2 +- .../UniTask/Runtime/Linq/Average.cs.meta | 2 +- .../UniTask/Runtime/Linq/Buffer.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Cast.cs.meta | 2 +- .../Runtime/Linq/CombineLatest.cs.meta | 2 +- .../UniTask/Runtime/Linq/Concat.cs.meta | 2 +- .../UniTask/Runtime/Linq/Contains.cs.meta | 2 +- .../UniTask/Runtime/Linq/Count.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Create.cs | 12 +- .../UniTask/Runtime/Linq/Create.cs.meta | 2 +- .../Runtime/Linq/DefaultIfEmpty.cs.meta | 2 +- .../UniTask/Runtime/Linq/Distinct.cs.meta | 2 +- .../Runtime/Linq/DistinctUntilChanged.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Do.cs.meta | 2 +- .../UniTask/Runtime/Linq/ElementAt.cs.meta | 2 +- .../UniTask/Runtime/Linq/Empty.cs.meta | 2 +- .../UniTask/Runtime/Linq/Except.cs.meta | 2 +- .../UniTask/Runtime/Linq/First.cs.meta | 2 +- .../UniTask/Runtime/Linq/ForEach.cs.meta | 2 +- .../UniTask/Runtime/Linq/GroupBy.cs.meta | 2 +- .../UniTask/Runtime/Linq/GroupJoin.cs.meta | 2 +- .../UniTask/Runtime/Linq/Intersect.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Join.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Last.cs.meta | 2 +- .../UniTask/Runtime/Linq/LongCount.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Max.cs.meta | 2 +- Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs | 232 ++++++++++++++ .../UniTask/Runtime/Linq/Merge.cs.meta | 3 + .../Plugins/UniTask/Runtime/Linq/Min.cs.meta | 2 +- .../UniTask/Runtime/Linq/MinMax.cs.meta | 2 +- .../UniTask/Runtime/Linq/Never.cs.meta | 2 +- .../UniTask/Runtime/Linq/OfType.cs.meta | 2 +- .../UniTask/Runtime/Linq/OrderBy.cs.meta | 2 +- .../UniTask/Runtime/Linq/Pairwise.cs.meta | 2 +- .../UniTask/Runtime/Linq/Publish.cs.meta | 2 +- .../UniTask/Runtime/Linq/Queue.cs.meta | 2 +- .../UniTask/Runtime/Linq/Range.cs.meta | 2 +- .../UniTask/Runtime/Linq/Repeat.cs.meta | 2 +- .../UniTask/Runtime/Linq/Return.cs.meta | 2 +- .../UniTask/Runtime/Linq/Reverse.cs.meta | 2 +- .../UniTask/Runtime/Linq/Select.cs.meta | 2 +- .../UniTask/Runtime/Linq/SelectMany.cs.meta | 2 +- .../Runtime/Linq/SequenceEqual.cs.meta | 2 +- .../UniTask/Runtime/Linq/Single.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Skip.cs.meta | 2 +- .../UniTask/Runtime/Linq/SkipLast.cs.meta | 2 +- .../UniTask/Runtime/Linq/SkipUntil.cs.meta | 2 +- .../Runtime/Linq/SkipUntilCanceled.cs.meta | 2 +- .../UniTask/Runtime/Linq/SkipWhile.cs.meta | 2 +- .../UniTask/Runtime/Linq/Subscribe.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Sum.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Take.cs.meta | 2 +- .../UniTask/Runtime/Linq/TakeLast.cs.meta | 2 +- .../UniTask/Runtime/Linq/TakeUntil.cs.meta | 2 +- .../Runtime/Linq/TakeUntilCanceled.cs.meta | 2 +- .../UniTask/Runtime/Linq/TakeWhile.cs.meta | 2 +- .../UniTask/Runtime/Linq/Throw.cs.meta | 2 +- .../UniTask/Runtime/Linq/ToArray.cs.meta | 2 +- .../UniTask/Runtime/Linq/ToDictionary.cs.meta | 2 +- .../UniTask/Runtime/Linq/ToHashSet.cs.meta | 2 +- .../UniTask/Runtime/Linq/ToList.cs.meta | 2 +- .../UniTask/Runtime/Linq/ToLookup.cs.meta | 2 +- .../UniTask/Runtime/Linq/ToObservable.cs.meta | 2 +- .../Linq/ToUniTaskAsyncEnumerable.cs.meta | 2 +- .../Runtime/Linq/UniTask.Linq.asmdef.meta | 2 +- .../UniTask/Runtime/Linq/Union.cs.meta | 2 +- .../UniTask/Runtime/Linq/UnityExtensions.meta | 2 +- .../Linq/UnityExtensions/EveryUpdate.cs | 43 ++- .../Linq/UnityExtensions/EveryUpdate.cs.meta | 2 +- .../Linq/UnityExtensions/EveryValueChanged.cs | 90 ++++-- .../UnityExtensions/EveryValueChanged.cs.meta | 2 +- .../Runtime/Linq/UnityExtensions/Timer.cs | 95 ++++-- .../Linq/UnityExtensions/Timer.cs.meta | 2 +- .../UniTask/Runtime/Linq/Where.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Linq/Zip.cs.meta | 2 +- .../UniTask/Runtime/MoveNextSource.cs.meta | 2 +- .../UniTask/Runtime/PlayerLoopHelper.cs | 6 +- .../UniTask/Runtime/PlayerLoopHelper.cs.meta | 2 +- .../UniTask/Runtime/PlayerLoopTimer.cs.meta | 2 +- .../Plugins/UniTask/Runtime/Progress.cs.meta | 2 +- .../Plugins/UniTask/Runtime/TaskPool.cs.meta | 2 +- .../UniTask/Runtime/TimeoutController.cs.meta | 2 +- .../Plugins/UniTask/Runtime/TriggerEvent.cs | 116 +++---- .../UniTask/Runtime/TriggerEvent.cs.meta | 2 +- Runtime/Plugins/UniTask/Runtime/Triggers.meta | 2 +- .../Triggers/AsyncAwakeTrigger.cs.meta | 2 +- .../Runtime/Triggers/AsyncDestroyTrigger.cs | 12 +- .../Triggers/AsyncDestroyTrigger.cs.meta | 2 +- .../Triggers/AsyncStartTrigger.cs.meta | 2 +- .../Runtime/Triggers/AsyncTriggerBase.cs.meta | 2 +- .../Triggers/AsyncTriggerExtensions.cs.meta | 2 +- .../MonoBehaviourMessagesTriggers.cs.meta | 2 +- .../UniTask/Runtime/UniTask.Bridge.cs.meta | 2 +- .../Plugins/UniTask/Runtime/UniTask.Delay.cs | 175 ++++++++--- .../UniTask/Runtime/UniTask.Delay.cs.meta | 2 +- .../UniTask/Runtime/UniTask.Factory.cs.meta | 2 +- .../UniTask/Runtime/UniTask.Run.cs.meta | 2 +- .../UniTask/Runtime/UniTask.Threading.cs.meta | 2 +- .../UniTask/Runtime/UniTask.WaitUntil.cs | 83 ++++- .../UniTask/Runtime/UniTask.WaitUntil.cs.meta | 2 +- .../Runtime/UniTask.WhenAll.Generated.cs.meta | 2 +- .../UniTask/Runtime/UniTask.WhenAll.cs.meta | 2 +- .../Runtime/UniTask.WhenAny.Generated.cs.meta | 2 +- .../UniTask/Runtime/UniTask.WhenAny.cs.meta | 2 +- .../UniTask/Runtime/UniTask.asmdef.meta | 2 +- .../Plugins/UniTask/Runtime/UniTask.cs.meta | 2 +- .../Runtime/UniTaskCompletionSource.cs | 25 +- .../Runtime/UniTaskCompletionSource.cs.meta | 2 +- .../UniTaskExtensions.Shorthand.cs.meta | 2 +- .../UniTask/Runtime/UniTaskExtensions.cs | 4 +- .../UniTask/Runtime/UniTaskExtensions.cs.meta | 2 +- .../UniTaskObservableExtensions.cs.meta | 2 +- .../UniTask/Runtime/UniTaskScheduler.cs.meta | 2 +- .../UniTaskSynchronizationContext.cs.meta | 2 +- .../UniTask/Runtime/UniTaskVoid.cs.meta | 2 +- ...cExtensions.AssetBundleRequestAllAssets.cs | 56 +++- ...nsions.AssetBundleRequestAllAssets.cs.meta | 2 +- .../UnityAsyncExtensions.AsyncGPUReadback.cs | 25 +- ...tyAsyncExtensions.AsyncGPUReadback.cs.meta | 2 +- .../Runtime/UnityAsyncExtensions.Jobs.cs.meta | 2 +- ...UnityAsyncExtensions.MonoBehaviour.cs.meta | 2 +- .../UniTask/Runtime/UnityAsyncExtensions.cs | 291 ++++++++++++++++-- .../Runtime/UnityAsyncExtensions.cs.meta | 2 +- .../Runtime/UnityAsyncExtensions.uGUI.cs.meta | 2 +- .../Runtime/UnityAwaitableExtensions.cs | 17 + .../Runtime/UnityAwaitableExtensions.cs.meta | 3 + .../Runtime/UnityBindingExtensions.cs.meta | 2 +- .../Runtime/UnityWebRequestException.cs.meta | 2 +- .../Runtime/_InternalVisibleTo.cs.meta | 2 +- Runtime/Plugins/UniTask/package.json | 28 +- .../DeepLinkWallets/PhantomDeepLink.cs | 1 + Runtime/codebase/DeepLinkWallets/Utils.cs | 1 + .../LocalAssociationScenario.cs | 2 - .../MobileWalletAdapterWebSocket.cs | 1 - Runtime/codebase/WalletBase.cs | 8 +- Runtime/codebase/Web3.cs | 12 +- .../Solana Wallet/Scenes/wallet_scene.unity | 34 +- .../Scripts/example/screens/WalletScreen.cs | 38 ++- .../Textures/magicblock-logo.png.meta | 12 + 202 files changed, 1397 insertions(+), 559 deletions(-) create mode 100644 Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs create mode 100644 Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs.meta create mode 100644 Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs create mode 100644 Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs.meta diff --git a/Packages/NativeWebSocket.dll b/Packages/NativeWebSocket.dll index ce5f619158129e3e20a99a5bf569098a7ecffc23..fb71b82886a5c7f50babae74586c14a39f5a7887 100644 GIT binary patch literal 19968 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 WqyB*o=No}ufnoIj|M~wO2mW6$fN-<` literal 199168 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%0Ap-i!7)2Bc=QeA^cSaFWMau7* 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 diff --git a/Runtime/Plugins/UniTask/Editor.meta b/Runtime/Plugins/UniTask/Editor.meta index 579b2db2..55e810b6 100644 --- a/Runtime/Plugins/UniTask/Editor.meta +++ b/Runtime/Plugins/UniTask/Editor.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 20258684eba20467096e6f5e29c3c27a +guid: 00957b1ea0bfd4e7e8c7c9a8ce63aef4 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Editor/SplitterGUILayout.cs.meta b/Runtime/Plugins/UniTask/Editor/SplitterGUILayout.cs.meta index 378d6c33..4d718f4e 100644 --- a/Runtime/Plugins/UniTask/Editor/SplitterGUILayout.cs.meta +++ b/Runtime/Plugins/UniTask/Editor/SplitterGUILayout.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 757c9c5807884460b90a4a4589ef3e69 +guid: 40ef2e46f900131419e869398a8d3c9d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Editor/UniTask.Editor.asmdef.meta b/Runtime/Plugins/UniTask/Editor/UniTask.Editor.asmdef.meta index b0383bfc..821b87b7 100644 --- a/Runtime/Plugins/UniTask/Editor/UniTask.Editor.asmdef.meta +++ b/Runtime/Plugins/UniTask/Editor/UniTask.Editor.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6a68f3363dee742f5bddb0649a21f17b +guid: 4129704b5a1a13841ba16f230bf24a57 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs.meta b/Runtime/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs.meta index fe57a358..9b34d7b9 100644 --- a/Runtime/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs.meta +++ b/Runtime/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ada1f4f0677ee44e78b7b9cc73338dca +guid: 52e2d973a2156674e8c1c9433ed031f7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs.meta b/Runtime/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs.meta index 103ec8d3..ba1b7045 100644 --- a/Runtime/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs.meta +++ b/Runtime/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4ffa85870fcdc4a2eb34f5a517172a13 +guid: 5bee3e3860e37484aa3b861bf76d129f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime.meta b/Runtime/Plugins/UniTask/Runtime.meta index 8ca4ec06..a7e2184c 100644 --- a/Runtime/Plugins/UniTask/Runtime.meta +++ b/Runtime/Plugins/UniTask/Runtime.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: be6d6d7e41ee44cbe91dee1ca9591886 +guid: b224bae2cf96242429c852ebcccc8efa folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/AsyncLazy.cs.meta b/Runtime/Plugins/UniTask/Runtime/AsyncLazy.cs.meta index 051d7961..554d1628 100644 --- a/Runtime/Plugins/UniTask/Runtime/AsyncLazy.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/AsyncLazy.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6ac6f88263ced4ef2aa09dd3b1d929e8 +guid: 01d1404ca421466419a7db7340ff5e77 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/AsyncReactiveProperty.cs.meta b/Runtime/Plugins/UniTask/Runtime/AsyncReactiveProperty.cs.meta index 106174af..d64e3cff 100644 --- a/Runtime/Plugins/UniTask/Runtime/AsyncReactiveProperty.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/AsyncReactiveProperty.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d2720eb6d626b4176b7fc2c6c8ca28cb +guid: 8ef320b87f537ee4fb2282e765dc6166 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/AsyncUnit.cs.meta b/Runtime/Plugins/UniTask/Runtime/AsyncUnit.cs.meta index f1c94748..e0ee1329 100644 --- a/Runtime/Plugins/UniTask/Runtime/AsyncUnit.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/AsyncUnit.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7f8f9d4bb69fa4f29beb3677a6dacd19 +guid: 4f95ac245430d304bb5128d13b6becc8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta b/Runtime/Plugins/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta index 772dcbf9..a4fe3fd9 100644 --- a/Runtime/Plugins/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CancellationTokenEqualityComparer.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 78fe21b1b4ff246e6bc5287bea9bd762 +guid: 7d739f510b125b74fa7290ac4335e46e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CancellationTokenExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/CancellationTokenExtensions.cs.meta index 05ba103a..28a69586 100644 --- a/Runtime/Plugins/UniTask/Runtime/CancellationTokenExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CancellationTokenExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9930b5aa613dd4feab81c81d3e04d2ff +guid: 4be7209f04146bd45ac5ee775a5f7c26 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta index 0b0d1daf..fd09fe4b 100644 --- a/Runtime/Plugins/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CancellationTokenSourceExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 810bc09d6065e427eb5466711c202148 +guid: 22d85d07f1e70ab42a7a4c25bd65e661 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Channel.cs.meta b/Runtime/Plugins/UniTask/Runtime/Channel.cs.meta index 9c2fc683..32edb9c0 100644 --- a/Runtime/Plugins/UniTask/Runtime/Channel.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Channel.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 92e7a1cc41a8f4f3db5ee42658e8a4c8 +guid: 5ceb3107bbdd1f14eb39091273798360 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CompilerServices.meta b/Runtime/Plugins/UniTask/Runtime/CompilerServices.meta index 5c74e492..ab25ff95 100644 --- a/Runtime/Plugins/UniTask/Runtime/CompilerServices.meta +++ b/Runtime/Plugins/UniTask/Runtime/CompilerServices.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1728867db4cd04431ae783e464fd1ce5 +guid: 93c23b040306c4ab89735ba8fb5e1a05 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta b/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta index 5c08f53f..19961dfb 100644 --- a/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncMethodBuilderAttribute.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3a1e7504c88f6413bae2594091642b8c +guid: 02ce354d37b10454e8376062f7cbe57a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta b/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta index 04f5b093..ad43cfcf 100644 --- a/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskMethodBuilder.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9b51da797ef2a43e2b96a17b02113fe9 +guid: 68d72a45afdec574ebc26e7de2c38330 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta b/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta index 72cdedac..9bcc50e0 100644 --- a/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CompilerServices/AsyncUniTaskVoidMethodBuilder.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a0c856c8e72e24007be4a4a1645a6318 +guid: e891aaac17b933a47a9d7fa3b8e1226f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta b/Runtime/Plugins/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta index b6e8ecfc..2cb82e08 100644 --- a/Runtime/Plugins/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/CompilerServices/StateMachineRunner.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e2e94e59d752448ee89d2ff4d0f11ace +guid: 98649642833cabf44a9dc060ce4c84a1 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta index 70e26df3..d2e49304 100644 --- a/Runtime/Plugins/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/EnumerableAsyncExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9365cf5a5094e475f9b5730d06a4aaf7 +guid: ff50260d74bd54c4b92cf99895549445 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta index c9e4c738..a07b336d 100644 --- a/Runtime/Plugins/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/EnumeratorAsyncExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 189ff75a1d1a04c909861ea11153799a +guid: bc661232f11e4a741af54ba1c175d5ee MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/ExceptionExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/ExceptionExtensions.cs.meta index 02f4d3b9..98330016 100644 --- a/Runtime/Plugins/UniTask/Runtime/ExceptionExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/ExceptionExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a88bc0733bfb2466aa80faacddcefda6 +guid: 930800098504c0d46958ce23a0495202 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/External.meta b/Runtime/Plugins/UniTask/Runtime/External.meta index 98b3f820..fc582e6f 100644 --- a/Runtime/Plugins/UniTask/Runtime/External.meta +++ b/Runtime/Plugins/UniTask/Runtime/External.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 299b15dca66cf48d5928bdca8776f741 +guid: 2ca1bcb72294c4fa9a81473cb24e7201 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/External/Addressables.meta b/Runtime/Plugins/UniTask/Runtime/External/Addressables.meta index 617e0806..d9f899da 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/Addressables.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/Addressables.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1fea76f24c2454f92ae690ce47c7e9db +guid: a269b9a4ab6134332b74afc342e9ccfa folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs b/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs index f321bdba..a0ca8a1f 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs +++ b/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs @@ -25,7 +25,12 @@ public static UniTask WithCancellation(this AsyncOperationHandle handle, Cancell return ToUniTask(handle, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); @@ -44,7 +49,7 @@ public static UniTask WithCancellation(this AsyncOperationHandle handle, Cancell return UniTask.CompletedTask; } - return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, out var token), token); + return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct AsyncOperationHandleAwaiter : ICriticalNotifyCompletion @@ -106,6 +111,7 @@ static AsyncOperationHandleConfiguredSource() readonly Action continuationAction; AsyncOperationHandle handle; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; IProgress progress; bool completed; @@ -116,7 +122,7 @@ static AsyncOperationHandleConfiguredSource() continuationAction = Continuation; } - public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -132,6 +138,15 @@ public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTimin result.progress = progress; result.cancellationToken = cancellationToken; result.completed = false; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (AsyncOperationHandleConfiguredSource)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -219,6 +234,7 @@ bool TryReturn() handle = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -237,7 +253,12 @@ public static UniTask WithCancellation(this AsyncOperationHandle handle return ToUniTask(handle, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); @@ -255,7 +276,7 @@ public static UniTask WithCancellation(this AsyncOperationHandle handle return UniTask.FromResult(handle.Result); } - return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, out var token), token); + return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, cancelImmediately, out var token), token); } sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode> @@ -272,6 +293,7 @@ static AsyncOperationHandleConfiguredSource() readonly Action> continuationAction; AsyncOperationHandle handle; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; IProgress progress; bool completed; @@ -282,7 +304,7 @@ static AsyncOperationHandleConfiguredSource() continuationAction = Continuation; } - public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -298,6 +320,15 @@ public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoo result.cancellationToken = cancellationToken; result.completed = false; result.progress = progress; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (AsyncOperationHandleConfiguredSource)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -390,6 +421,7 @@ bool TryReturn() handle = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } diff --git a/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta index 6ba66a3d..6927930d 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aa87456ab4bfb49dd86a9e8d43369166 +guid: 3dc6441f9094f354b931dc3c79fb99e5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/External/Addressables/UniTask.Addressables.asmdef.meta b/Runtime/Plugins/UniTask/Runtime/External/Addressables/UniTask.Addressables.asmdef.meta index 3a779038..b0178c4a 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/Addressables/UniTask.Addressables.asmdef.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/Addressables/UniTask.Addressables.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: deab4bec1c51f4a7b9066fa7d61fea7c +guid: 593a5b492d29ac6448b1ebf7f035ef33 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/UniTask/Runtime/External/DOTween.meta b/Runtime/Plugins/UniTask/Runtime/External/DOTween.meta index 9fac58de..d1fe3f4e 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/DOTween.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/DOTween.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e4bf632f7899340fcb6a98ddea28d866 +guid: e9044e6516f78424f9ce47f4ad5790aa folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs b/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs index 80ae27c0..ba783672 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs +++ b/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs @@ -144,22 +144,20 @@ static TweenConfiguredSource() } readonly TweenCallback onCompleteCallbackDelegate; - readonly TweenCallback onUpdateDelegate; Tween tween; TweenCancelBehaviour cancelBehaviour; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationRegistration; CallbackType callbackType; bool canceled; - TweenCallback originalUpdateAction; TweenCallback originalCompleteAction; UniTaskCompletionSourceCore core; TweenConfiguredSource() { onCompleteCallbackDelegate = OnCompleteCallbackDelegate; - onUpdateDelegate = OnUpdate; } public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBehaviour, CancellationToken cancellationToken, CallbackType callbackType, out short token) @@ -179,17 +177,8 @@ public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBeha result.cancelBehaviour = cancelBehaviour; result.cancellationToken = cancellationToken; result.callbackType = callbackType; - - result.originalUpdateAction = tween.onUpdate; result.canceled = false; - if (result.originalUpdateAction == result.onUpdateDelegate) - { - result.originalUpdateAction = null; - } - - tween.onUpdate = result.onUpdateDelegate; - switch (callbackType) { case CallbackType.Kill: @@ -225,6 +214,50 @@ public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBeha result.originalCompleteAction = null; } + if (cancellationToken.CanBeCanceled) + { + result.cancellationRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(x => + { + var source = (TweenConfiguredSource)x; + switch (source.cancelBehaviour) + { + case TweenCancelBehaviour.Kill: + default: + source.tween.Kill(false); + break; + case TweenCancelBehaviour.KillAndCancelAwait: + source.canceled = true; + source.tween.Kill(false); + break; + case TweenCancelBehaviour.KillWithCompleteCallback: + source.tween.Kill(true); + break; + case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait: + source.canceled = true; + source.tween.Kill(true); + break; + case TweenCancelBehaviour.Complete: + source.tween.Complete(false); + break; + case TweenCancelBehaviour.CompleteAndCancelAwait: + source.canceled = true; + source.tween.Complete(false); + break; + case TweenCancelBehaviour.CompleteWithSequenceCallback: + source.tween.Complete(true); + break; + case TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait: + source.canceled = true; + source.tween.Complete(true); + break; + case TweenCancelBehaviour.CancelAwait: + source.RestoreOriginalCallback(); + source.core.TrySetCanceled(source.cancellationToken); + break; + } + }, result); + } + TaskTracker.TrackActiveTask(result, 3); token = result.core.Version; @@ -255,77 +288,6 @@ void OnCompleteCallbackDelegate() } } - void OnUpdate() - { - originalUpdateAction?.Invoke(); - - if (!cancellationToken.IsCancellationRequested) - { - return; - } - - switch (this.cancelBehaviour) - { - case TweenCancelBehaviour.Kill: - default: - this.tween.Kill(false); - break; - case TweenCancelBehaviour.KillAndCancelAwait: - this.canceled = true; - this.tween.Kill(false); - break; - case TweenCancelBehaviour.KillWithCompleteCallback: - this.tween.Kill(true); - break; - case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait: - this.canceled = true; - this.tween.Kill(true); - break; - case TweenCancelBehaviour.Complete: - this.tween.Complete(false); - break; - case TweenCancelBehaviour.CompleteAndCancelAwait: - this.canceled = true; - this.tween.Complete(false); - break; - case TweenCancelBehaviour.CompleteWithSequenceCallback: - this.tween.Complete(true); - break; - case TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait: - this.canceled = true; - this.tween.Complete(true); - break; - case TweenCancelBehaviour.CancelAwait: - // restore to original callback - switch (callbackType) - { - case CallbackType.Kill: - tween.onKill = originalCompleteAction; - break; - case CallbackType.Complete: - tween.onComplete = originalCompleteAction; - break; - case CallbackType.Pause: - tween.onPause = originalCompleteAction; - break; - case CallbackType.Play: - tween.onPlay = originalCompleteAction; - break; - case CallbackType.Rewind: - tween.onRewind = originalCompleteAction; - break; - case CallbackType.StepComplete: - tween.onStepComplete = originalCompleteAction; - break; - default: - break; - } - - this.core.TrySetCanceled(this.cancellationToken); - break; - } - } - static void DoCancelBeforeCreate(Tween tween, TweenCancelBehaviour tweenCancelBehaviour) { @@ -392,8 +354,18 @@ bool TryReturn() { TaskTracker.RemoveTracking(this); core.Reset(); - tween.onUpdate = originalUpdateAction; + cancellationRegistration.Dispose(); + + RestoreOriginalCallback(); + + tween = default; + cancellationToken = default; + originalCompleteAction = default; + return pool.TryPush(this); + } + void RestoreOriginalCallback() + { switch (callbackType) { case CallbackType.Kill: @@ -417,12 +389,6 @@ bool TryReturn() default: break; } - - tween = default; - cancellationToken = default; - originalUpdateAction = default; - originalCompleteAction = default; - return pool.TryPush(this); } } } diff --git a/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta index 02ef2c6f..63131b04 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 723feb5764c154d8d9d988aadd60476b +guid: 1f448d5bc5b232e4f98d89d5d1832e8e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef.meta b/Runtime/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef.meta index 88006aa4..427fe290 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 379adf41f5598409f83ca2525715f2b6 +guid: 029c1c1b674aaae47a6841a0b89ad80e AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro.meta b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro.meta index 985e64ec..f3b281ce 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32d987b0837f846999638807bbb58ad7 +guid: 3000d56e152ee4f8490e21e4ca34665e folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta index 0c4607ff..2e39d2e8 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.InputField.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e24fd13ef7bfc4e9785edcb4c0c2b2dd +guid: 79f4f2475e0b2c44e97ed1dee760627b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta index cca2e100..752d125c 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fac613b8b991f43bd95c7ecfecc2f6d9 +guid: b6ba480edafb67d4e91bb10feb64fae5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/UniTask.TextMeshPro.asmdef.meta b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/UniTask.TextMeshPro.asmdef.meta index 757ed7ec..4b59831d 100644 --- a/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/UniTask.TextMeshPro.asmdef.meta +++ b/Runtime/Plugins/UniTask/Runtime/External/TextMeshPro/UniTask.TextMeshPro.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bcddff3237d2a436f882a861852d9c98 +guid: dc47925d1a5fa2946bdd37746b2b5d48 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta b/Runtime/Plugins/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta index 2fd9670f..12f0fe52 100644 --- a/Runtime/Plugins/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/IUniTaskAsyncEnumerable.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 24706c0b3bec34a238248bae410e40fa +guid: b20cf9f02ac585948a4372fa4ee06504 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/IUniTaskSource.cs.meta b/Runtime/Plugins/UniTask/Runtime/IUniTaskSource.cs.meta index fef67791..b225d1c7 100644 --- a/Runtime/Plugins/UniTask/Runtime/IUniTaskSource.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/IUniTaskSource.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 30d8064206fcf4c78a681f3b6c839af1 +guid: 3e4d023d8404ab742b5e808c98097c3c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal.meta b/Runtime/Plugins/UniTask/Runtime/Internal.meta index 226b2002..98434369 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: deb6f0bc7f6024b5e81fa6597ba49f28 +guid: 9b8cd81208e344aed87c9a42137698e7 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPool.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPool.cs.meta index ec017dda..693816cc 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPool.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPool.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2e4c55bf990ad4ec5b25ac79ce3d6f19 +guid: f83ebad81fb89fb4882331616ca6d248 timeCreated: 1532361008 licenseType: Free MonoImporter: diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta index b8ad02db..e06ec652 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/ArrayPoolUtil.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1762575501ca24b709ef7e688582f07d +guid: 424cc208fb61d4e448b08fcfa0eee25e timeCreated: 1532361007 licenseType: Free MonoImporter: diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/ArrayUtil.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/ArrayUtil.cs.meta index 249f5d07..645fc4ed 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/ArrayUtil.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/ArrayUtil.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9eb7f2d9267334fdc83db5350e5ef381 +guid: 23146a82ec99f2542a87971c8d3d7988 timeCreated: 1532361007 licenseType: Free MonoImporter: diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs.meta index 71d88d18..b04e5418 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 611d628808ef044f9a31f764220aa570 +guid: f66c32454e50f2546b17deadc80a4c77 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta index ec39c1d4..6c1f06c2 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/DiagnosticsExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aed102a50ce6047e5957707b637e721e +guid: f80fb1c9ed4c99447be1b0a47a8d980b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs b/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs index 5c7bc93b..9664491e 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs +++ b/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs @@ -39,7 +39,7 @@ public static Exception MoreThanOneElement() } [MethodImpl(MethodImplOptions.NoInlining)] - public static void ThrowArgumentException(string message) + public static void ThrowArgumentException(string message) { throw new ArgumentException(message); } diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs.meta index f8ded3c7..2e5d219a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/Error.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: db3f01de5a2d14623ae6c1da4ef54cb4 +guid: 5f39f495294d4604b8082202faf98554 timeCreated: 1532361007 licenseType: Free MonoImporter: diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/MinimumQueue.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/MinimumQueue.cs.meta index 99910884..dc067367 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/MinimumQueue.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/MinimumQueue.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b81a153d6449d43baaf38a3fbf2ff64a +guid: 7d63add489ccc99498114d79702b904d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta index c24b6c54..603dbc93 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/PlayerLoopRunner.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 18e9b12463d6b46b081d270376b2eae5 +guid: 340c6d420bb4f484aa8683415ea92571 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/PooledDelegate.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/PooledDelegate.cs.meta index 2c728d74..7f92aff4 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/PooledDelegate.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/PooledDelegate.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 08245a2cfb5c44e718f5b24dc14eb798 +guid: 8932579438742fa40b010edd412dbfba MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta index 37ea0133..42543911 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/RuntimeHelpersAbstraction.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2b1eb460262b74130ad0e71d632b34dd +guid: 94975e4d4e0c0ea4ba787d3872ce9bb4 timeCreated: 1532361007 licenseType: Free MonoImporter: diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/StatePool.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/StatePool.cs.meta index ebad65f6..6779aa1e 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/StatePool.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/StatePool.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 59c18854b71e14a02b801240afb7206b +guid: 60cdf0bcaea36b444a7ae7263ae7598f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/TaskTracker.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/TaskTracker.cs.meta index 366de860..5563bf78 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/TaskTracker.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/TaskTracker.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4e995db5acdeb4dcb8083f2c3e1f8d1b +guid: a203c73eb4ccdbb44bddfd82d38fdda9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta index 57ae8a6b..79eb04f6 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/UnityEqualityComparer.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a746f255a4f4b413cbdf3c8d339056b1 +guid: ebaaf14253c9cfb47b23283218ff9b67 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta index 80ac856c..54bd2eb5 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/UnityWebRequestExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a29b6d6e34dae462b916d824000955de +guid: 111ba0e639de1d7428af6c823ead4918 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/ValueStopwatch.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/ValueStopwatch.cs.meta index 12e6ba16..b7c6b09c 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/ValueStopwatch.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/ValueStopwatch.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 176a55bc1c42140c9890c7d0e1b9c9dd +guid: f16fb466974ad034c8732c79c7fd67ea MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Internal/WeakDictionary.cs.meta b/Runtime/Plugins/UniTask/Runtime/Internal/WeakDictionary.cs.meta index f552ec77..9dc1672a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Internal/WeakDictionary.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Internal/WeakDictionary.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4b58d363fe90b4a8ca04afd3a10934ef +guid: 6c78563864409714593226af59bcb6f3 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq.meta b/Runtime/Plugins/UniTask/Runtime/Linq.meta index 17962c41..84c6b809 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 49c52f5b7b3c145a2b7e9148b51771a1 +guid: 16e777c0358454462bac054378120a6b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Aggregate.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Aggregate.cs.meta index 1bb87889..837df4a9 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Aggregate.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Aggregate.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fa9a14e95f1484a2d90d4f7f8491800e +guid: 5dc68c05a4228c643937f6ebd185bcca MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/All.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/All.cs.meta index d69ee70b..d378ff0e 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/All.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/All.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: eaf904b22414c4fbdb39d74246aee47b +guid: 7271437e0033af2448b600ee248924dd MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Any.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Any.cs.meta index d19f524c..1070bcc8 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Any.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Any.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dd542510044d6414cbdfae0bc4bb0f1a +guid: e2b2e65745263994fbe34f3e0ec8eb12 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/AppendPrepend.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/AppendPrepend.cs.meta index 3ad9dc0b..6d2ee046 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/AppendPrepend.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/AppendPrepend.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 505bef489ec554ad0973ee93c446b305 +guid: 3268ec424b8055f45aa2a26d17c80468 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta index 30058bb8..90f6207c 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/AsUniTaskAsyncEnumerable.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bc8583baaeda445c9b7898899e94e911 +guid: 69866e262589ea643bbc62a1d696077a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta index d3a3f41b..a4e96dc0 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/AsyncEnumeratorBase.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1bda87df02af740f3a54c10463e0aaf0 +guid: 01ba1d3b17e13fb4c95740131c7e6e19 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Average.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Average.cs.meta index ff37945d..8f60dfc5 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Average.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Average.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a7c6cd0051ef143f986abc47b37a0760 +guid: 58499f95012fb3c47bb7bcbc5862e562 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Buffer.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Buffer.cs.meta index 1f4d0841..e7154e4d 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Buffer.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Buffer.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 873316a95d2c8424d8950328d32684fc +guid: 951310243334a3148a7872977cb31c5c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Cast.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Cast.cs.meta index 6f302567..913b043c 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Cast.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Cast.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: eb968bbccf79d46878380c36bb08c45b +guid: edebeae8b61352b428abe9ce8f3fc71a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/CombineLatest.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/CombineLatest.cs.meta index 448f206a..4e8b1c34 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/CombineLatest.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/CombineLatest.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 46f7a2abd48224fd0939e595500ade2e +guid: 6cb07f6e88287e34d9b9301a572284a5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Concat.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Concat.cs.meta index 9da3d067..6bfcf318 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Concat.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Concat.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: abb661f299c144fc0a5f98c51ab16493 +guid: 7cb9e19c449127a459851a135ce7d527 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Contains.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Contains.cs.meta index e8d3ae62..9bd414b3 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Contains.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Contains.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aec551cf769b443cc85b7752a88cde33 +guid: 36ab06d30f3223048b4f676e05431a7f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Count.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Count.cs.meta index a36c40b0..35db3324 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Count.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Count.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 432afad2af1cc4b6fbb7d369bc296314 +guid: e606d38eed688574bb2ba89d983cc9bb MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs b/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs index 61b7afd3..fa34774a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs @@ -52,6 +52,7 @@ public _Create(Func, CancellationToken, UniTask> create, Cancell public UniTask DisposeAsync() { TaskTracker.RemoveTracking(this); + writer.Dispose(); return default; } @@ -127,7 +128,7 @@ public void SetResult(T value) } } - sealed class AsyncWriter : IUniTaskSource, IAsyncWriter + sealed class AsyncWriter : IUniTaskSource, IAsyncWriter, IDisposable { readonly _Create enumerator; @@ -137,6 +138,15 @@ public AsyncWriter(_Create enumerator) { this.enumerator = enumerator; } + + public void Dispose() + { + var status = core.GetStatus(core.Version); + if (status == UniTaskStatus.Pending) + { + core.TrySetCanceled(); + } + } public void GetResult(short token) { diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs.meta index 32e3de91..5aba456f 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Create.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 510ed9b9c8bb146dba31f52d4777d517 +guid: 0202f723469f93945afa063bfb440d15 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta index c4923431..5aa59939 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/DefaultIfEmpty.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3b099d406639b4f8eb92e4e001e11f0f +guid: 19e437c039ad7e1478dbce1779ef8660 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Distinct.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Distinct.cs.meta index b677c3dc..61804b7f 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Distinct.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Distinct.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 835dfcda4f86c42928b16b8912ddedbe +guid: 8f09903be66e5d943b243d7c19cb3811 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta index 61ce6e74..84cddf8d 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/DistinctUntilChanged.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5705cb2b14bb24792bd585334797e143 +guid: 0351f6767df7e644b935d4d599968162 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Do.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Do.cs.meta index 6091c31c..766bbb5f 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Do.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Do.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b82c105749c7c4ac7bc2ff861c90f292 +guid: dd83c8e12dedf75409b829b93146d130 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ElementAt.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ElementAt.cs.meta index 33838d24..fb0850b6 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ElementAt.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ElementAt.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 63b84e9a00c96452ab1eb85d3fd357ea +guid: c835bd2dd8555234c8919c7b8ef3b69a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Empty.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Empty.cs.meta index 8114a5fa..bfa577ac 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Empty.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Empty.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5fa012cfc8578411fa2dcedffc464fb9 +guid: 4fa123ad6258abb4184721b719a13810 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Except.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Except.cs.meta index 7e4e9f1c..f61a1aab 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Except.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Except.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 083be680d35c940188ba825cd85116a6 +guid: 38c1c4129f59dcb49a5b864eaf4ec63c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/First.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/First.cs.meta index 463cdd98..6924307a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/First.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/First.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1f512525f32364c539fc525dce70b111 +guid: 417946e97e9eed84db6f840f57037ca6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ForEach.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ForEach.cs.meta index 3c520a45..53177562 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ForEach.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ForEach.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 28e73d3585f3c49b88a59ecdfde8ed1f +guid: ca8d7f8177ba16140920af405aea3fd4 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/GroupBy.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/GroupBy.cs.meta index 72d87686..14897018 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/GroupBy.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/GroupBy.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7f8a59d6f12a7465f850194b9663ce68 +guid: a2de80df1cc8a1240ab0ee7badd334d0 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/GroupJoin.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/GroupJoin.cs.meta index 3785e0e4..f171ed19 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/GroupJoin.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/GroupJoin.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f0a3252eeddbf4415acc771696b3e548 +guid: 7bf7759d03bf3f64190d3ae83b182c2c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Intersect.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Intersect.cs.meta index 434bc31f..28cf8e30 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Intersect.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Intersect.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a3d1fe9a183174198947f7ac05f972a1 +guid: 93999a70f5d57134bbe971f3e988c4f2 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Join.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Join.cs.meta index eef7d470..3ab1015a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Join.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Join.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 24997b01ff0234c2cb8d642fd10dcc21 +guid: dc4ff8cb6d7c9a64896f2f082124d6b3 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Last.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Last.cs.meta index 3112d2ab..edfa124a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Last.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Last.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5c639f428fc2a4dc894df3e20caecad6 +guid: a0ccc93be1387fa4a975f06310127c11 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/LongCount.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/LongCount.cs.meta index 414b5856..862c2bcf 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/LongCount.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/LongCount.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a0288a67a79f347f084e17ae0af821fb +guid: 198b39e58ced3ab4f97ccbe0916787d5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Max.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Max.cs.meta index 25a071e4..2125edf6 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Max.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Max.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8242bb34fd368426cac760f0d2958712 +guid: 5c8a118a6b664c441820b8a87d7f6e28 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs b/Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs new file mode 100644 index 00000000..d4ea969a --- /dev/null +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using Cysharp.Threading.Tasks.Internal; + +namespace Cysharp.Threading.Tasks.Linq +{ + public static partial class UniTaskAsyncEnumerable + { + public static IUniTaskAsyncEnumerable Merge(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second) + { + Error.ThrowArgumentNullException(first, nameof(first)); + Error.ThrowArgumentNullException(second, nameof(second)); + + return new Merge(new [] { first, second }); + } + + public static IUniTaskAsyncEnumerable Merge(this IUniTaskAsyncEnumerable first, IUniTaskAsyncEnumerable second, IUniTaskAsyncEnumerable third) + { + Error.ThrowArgumentNullException(first, nameof(first)); + Error.ThrowArgumentNullException(second, nameof(second)); + Error.ThrowArgumentNullException(third, nameof(third)); + + return new Merge(new[] { first, second, third }); + } + + public static IUniTaskAsyncEnumerable Merge(this IEnumerable> sources) + { + return new Merge(sources.ToArray()); + } + + public static IUniTaskAsyncEnumerable Merge(params IUniTaskAsyncEnumerable[] sources) + { + return new Merge(sources); + } + } + + internal sealed class Merge : IUniTaskAsyncEnumerable + { + readonly IUniTaskAsyncEnumerable[] sources; + + public Merge(IUniTaskAsyncEnumerable[] sources) + { + if (sources.Length <= 0) + { + Error.ThrowArgumentException("No source async enumerable to merge"); + } + this.sources = sources; + } + + public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) + => new _Merge(sources, cancellationToken); + + enum MergeSourceState + { + Pending, + Running, + Completed, + } + + sealed class _Merge : MoveNextSource, IUniTaskAsyncEnumerator + { + static readonly Action GetResultAtAction = GetResultAt; + + readonly int length; + readonly IUniTaskAsyncEnumerator[] enumerators; + readonly MergeSourceState[] states; + readonly Queue<(T, Exception, bool)> queuedResult = new Queue<(T, Exception, bool)>(); + readonly CancellationToken cancellationToken; + + int moveNextCompleted; + + public T Current { get; private set; } + + public _Merge(IUniTaskAsyncEnumerable[] sources, CancellationToken cancellationToken) + { + this.cancellationToken = cancellationToken; + length = sources.Length; + states = ArrayPool.Shared.Rent(length); + enumerators = ArrayPool>.Shared.Rent(length); + for (var i = 0; i < length; i++) + { + enumerators[i] = sources[i].GetAsyncEnumerator(cancellationToken); + states[i] = (int)MergeSourceState.Pending;; + } + } + + public UniTask MoveNextAsync() + { + cancellationToken.ThrowIfCancellationRequested(); + completionSource.Reset(); + Interlocked.Exchange(ref moveNextCompleted, 0); + + if (HasQueuedResult() && Interlocked.CompareExchange(ref moveNextCompleted, 1, 0) == 0) + { + (T, Exception, bool) value; + lock (states) + { + value = queuedResult.Dequeue(); + } + var resultValue = value.Item1; + var exception = value.Item2; + var hasNext = value.Item3; + if (exception != null) + { + completionSource.TrySetException(exception); + } + else + { + Current = resultValue; + completionSource.TrySetResult(hasNext); + } + return new UniTask(this, completionSource.Version); + } + + for (var i = 0; i < length; i++) + { + lock (states) + { + if (states[i] == MergeSourceState.Pending) + { + states[i] = MergeSourceState.Running; + } + else + { + continue; + } + } + var awaiter = enumerators[i].MoveNextAsync().GetAwaiter(); + if (awaiter.IsCompleted) + { + GetResultAt(i, awaiter); + } + else + { + awaiter.SourceOnCompleted(GetResultAtAction, StateTuple.Create(this, i, awaiter)); + } + } + return new UniTask(this, completionSource.Version); + } + + public async UniTask DisposeAsync() + { + for (var i = 0; i < length; i++) + { + await enumerators[i].DisposeAsync(); + } + + ArrayPool.Shared.Return(states, true); + ArrayPool>.Shared.Return(enumerators, true); + } + + static void GetResultAt(object state) + { + using (var tuple = (StateTuple<_Merge, int, UniTask.Awaiter>)state) + { + tuple.Item1.GetResultAt(tuple.Item2, tuple.Item3); + } + } + + void GetResultAt(int index, UniTask.Awaiter awaiter) + { + bool hasNext; + bool completedAll; + try + { + hasNext = awaiter.GetResult(); + } + catch (Exception ex) + { + if (Interlocked.CompareExchange(ref moveNextCompleted, 1, 0) == 0) + { + completionSource.TrySetException(ex); + } + else + { + lock (states) + { + queuedResult.Enqueue((default, ex, default)); + } + } + return; + } + + lock (states) + { + states[index] = hasNext ? MergeSourceState.Pending : MergeSourceState.Completed; + completedAll = !hasNext && IsCompletedAll(); + } + if (hasNext || completedAll) + { + if (Interlocked.CompareExchange(ref moveNextCompleted, 1, 0) == 0) + { + Current = enumerators[index].Current; + completionSource.TrySetResult(!completedAll); + } + else + { + lock (states) + { + queuedResult.Enqueue((enumerators[index].Current, null, !completedAll)); + } + } + } + } + + bool HasQueuedResult() + { + lock (states) + { + return queuedResult.Count > 0; + } + } + + bool IsCompletedAll() + { + lock (states) + { + for (var i = 0; i < length; i++) + { + if (states[i] != MergeSourceState.Completed) + { + return false; + } + } + } + return true; + } + } + } +} \ No newline at end of file diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs.meta new file mode 100644 index 00000000..2f671f4c --- /dev/null +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Merge.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ca56812f160c45d0bacb4339819edf1a +timeCreated: 1694133666 \ No newline at end of file diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Min.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Min.cs.meta index fa2ef2ca..91378dc9 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Min.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Min.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c732c699b2e784cfbadc52cbd46e755e +guid: 57ac9da21d3457849a8e45548290a508 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/MinMax.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/MinMax.cs.meta index 3480d4f5..3856b65f 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/MinMax.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/MinMax.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c977f90f8d35143deb73d606bcd0d70f +guid: 2d6da02d9ab970e4999daf7147d98e36 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Never.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Never.cs.meta index ae2c7a81..ba9d358c 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Never.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Never.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cdf187809f6294bf4a60b021cfd31a67 +guid: 8b307c3d3be71a94da251564bcdefa3d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/OfType.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/OfType.cs.meta index 63488435..6ace53fd 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/OfType.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/OfType.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 72c99a00c5e7c4090b6979e9145574a5 +guid: 111ffe87a7d700442a9ef5af554b252c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/OrderBy.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/OrderBy.cs.meta index 07683d45..5c6b3e4a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/OrderBy.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/OrderBy.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 96859dbdd7ebb40c4af2d95774ff0d27 +guid: 413883ceff8546143bdf200aafa4b8f7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Pairwise.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Pairwise.cs.meta index 7654caef..727b8cf4 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Pairwise.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Pairwise.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c2cc7af39f78243048442cd5f3d7dd44 +guid: cddbf051d2a88f549986c468b23214af MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Publish.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Publish.cs.meta index 5fcc2506..f3a81ba3 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Publish.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Publish.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f2b23922dd92948819b85841ad2a53f8 +guid: 93c684d1e88c09d4e89b79437d97b810 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Queue.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Queue.cs.meta index 7f5df690..35f3fab2 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Queue.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Queue.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0420b0019e39b43ae95a7a9cca19a9cb +guid: b7ea1bcf9dbebb042bc99c7816249e02 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Range.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Range.cs.meta index 646a94be..36272fcf 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Range.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Range.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 931cceefbded043f0a363f72a9d8c328 +guid: d826418a813498648b10542d0a5fb173 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Repeat.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Repeat.cs.meta index dd7de0b0..693d5790 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Repeat.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Repeat.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e738c31144f45401a8c2564020afe8a3 +guid: 3819a3925165a674d80ee848c8600379 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Return.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Return.cs.meta index 0c3308db..ad264d0d 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Return.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Return.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 920a9f7713eed4e63b60504a9d37ec78 +guid: 4313cd8ecf705e44f9064ce46e293c2c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Reverse.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Reverse.cs.meta index e4a40ee3..4a28306a 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Reverse.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Reverse.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8fbec1f19945644a098cb1115f725ba9 +guid: b2769e65c729b4f4ca6af9826d9c7b90 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Select.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Select.cs.meta index ef861863..476e9723 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Select.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Select.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6fe3e07e3aeef41a380675a8441a64d2 +guid: dc68e598ca44a134b988dfaf5e53bfba MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/SelectMany.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/SelectMany.cs.meta index ac8e9d0b..a8dbbaf6 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/SelectMany.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/SelectMany.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3ade0bdc8c41646c299ee2f677e93a7f +guid: d81862f0eb12680479ccaaf2ac319d24 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/SequenceEqual.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/SequenceEqual.cs.meta index 71cdffea..ee2b75c2 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/SequenceEqual.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/SequenceEqual.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9c1bc70e42d1b4448a699eb7bcc1ffeb +guid: b382772aba6128842928cdb6b2e034b0 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Single.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Single.cs.meta index 028d8e69..c053dfd7 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Single.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Single.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5348c0bf7ce21443abf80dcc379b8771 +guid: 1bcd3928b90472e43a3a92c3ba708967 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Skip.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Skip.cs.meta index f8401f2b..25ad847b 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Skip.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Skip.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a48593544b06c44f1ba3cd54eb98997e +guid: 9c46b6c7dce0cb049a73c81084c75154 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/SkipLast.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/SkipLast.cs.meta index 11f8438b..06b1ede4 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/SkipLast.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/SkipLast.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c14d8909af6f843a6b22f274b3a45772 +guid: df1d7f44d4fe7754f972c9e0b6fa72d5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntil.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntil.cs.meta index 85c9d039..0772ed01 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntil.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntil.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c4d07b784b6e046d8a5b87d527468627 +guid: de932d79c8d9f3841a066d05ff29edc9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta index 37bd7870..9f67181d 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/SkipUntilCanceled.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 63e3641a21cb848e4af02b6046a4dfd1 +guid: 4b1a778aef7150d47b93a49aa1bc34ae MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/SkipWhile.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/SkipWhile.cs.meta index 0e965d94..f2b210a9 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/SkipWhile.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/SkipWhile.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9a869ffb7f35640b4ab54139d133ae79 +guid: 0b74b9fe361bf7148b51a29c8b2561e8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Subscribe.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Subscribe.cs.meta index e058fe00..ea835671 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Subscribe.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Subscribe.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ce37c72d03ed34261b9d57b8c550101b +guid: 263479eb04c189741931fc0e2f615c2d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Sum.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Sum.cs.meta index 9e7c655a..5331e349 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Sum.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Sum.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e3329dc74cbc645dabc41210cc54da5d +guid: 4149754066a21a341be58c04357061f6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Take.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Take.cs.meta index 11379c8e..1cc91ab0 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Take.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Take.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1aea02ca2d431470ebdbfa6e289c36c0 +guid: 42f02cb84e5875b488304755d0e1383d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/TakeLast.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/TakeLast.cs.meta index 1e657ec0..d80037f4 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/TakeLast.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/TakeLast.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3464752ce0c584bf4bd8db4fd7254471 +guid: 510aa9fd35b45fc40bcdb7e59f01fd1b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntil.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntil.cs.meta index 89592876..44cf63e1 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntil.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntil.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e8393d34d923f48e7b42f37ee258dcbf +guid: 12bda324162f15349afefc2c152ac07f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta index 7f17b861..4a89be54 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/TakeUntilCanceled.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cb558a30cd9cc4ac9be8b1ee451455ab +guid: e82f498cf3a1df04cbf646773fc11319 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/TakeWhile.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/TakeWhile.cs.meta index 1c151a12..f2173d59 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/TakeWhile.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/TakeWhile.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b9546b37ff0184808b03b0baa0ef1ab6 +guid: bca55adabcc4b3141b50b8b09634f764 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Throw.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Throw.cs.meta index 65cf6a73..c768ef1e 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Throw.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Throw.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4bff3e6ac05994e5eb727e09146dde25 +guid: 9d05a7d4f4161e549b4789e1022baae8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToArray.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToArray.cs.meta index 7e4ad85c..679d61c9 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToArray.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToArray.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2636dd420810741a994a9d66e82fe6bd +guid: debb010bbb1622e43b94fe70ec0133dd MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToDictionary.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToDictionary.cs.meta index 3f594861..4deed194 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToDictionary.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToDictionary.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c751fb258afbb4fedbd45baa7060480a +guid: 03b109b1fe1f2df46aa56ffb26747654 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToHashSet.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToHashSet.cs.meta index bd59827c..8d3c4af2 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToHashSet.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToHashSet.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7a30ba92292214aacae975c7151d2803 +guid: 7a3e552113af96e4986805ec3c4fc80a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToList.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToList.cs.meta index 942b0c11..4f093738 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToList.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToList.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e9ea08239c8f548268af240ee2e6adef +guid: 3859c1b31e81d9b44b282e7d97e11635 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToLookup.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToLookup.cs.meta index ad707a89..7dd8ecd6 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToLookup.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToLookup.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6bbc7a186e1064c07abef0983b0cc27b +guid: 57da22563bcd6ca4aaf256d941de5cb0 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToObservable.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToObservable.cs.meta index c1240c6f..44d917e3 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToObservable.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToObservable.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 59348a3a80b03416e914f28a298d85d5 +guid: b4f6f48a532188e4c80b7ebe69aea3a8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta index 7f4f91e9..45fd3b08 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/ToUniTaskAsyncEnumerable.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 82bd0d2a1244f4c6497fd021caf940c8 +guid: d7192de2a0581ec4db62962cc1404af5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UniTask.Linq.asmdef.meta b/Runtime/Plugins/UniTask/Runtime/Linq/UniTask.Linq.asmdef.meta index 5422d111..1c85d19e 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UniTask.Linq.asmdef.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UniTask.Linq.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8920186e22a12415392e832bf77aad0a +guid: 5c01796d064528144a599661eaab93a6 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Union.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Union.cs.meta index 741314c2..1d9c7adb 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Union.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Union.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 94f726d8d96fb430fae93453be8c9ea9 +guid: ae57a55bdeba98b4f8ff234d98d7dd76 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions.meta b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions.meta index 1e0f4577..fd5b8fef 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 971afa354d7b04bd1970813cf2924613 +guid: f082b6b4912784efd9c3e7911c4968a8 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs index 585fff96..8f091100 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs @@ -4,38 +4,50 @@ namespace Cysharp.Threading.Tasks.Linq { public static partial class UniTaskAsyncEnumerable { - public static IUniTaskAsyncEnumerable EveryUpdate(PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) + public static IUniTaskAsyncEnumerable EveryUpdate(PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) { - return new EveryUpdate(updateTiming); + return new EveryUpdate(updateTiming, cancelImmediately); } } internal class EveryUpdate : IUniTaskAsyncEnumerable { readonly PlayerLoopTiming updateTiming; + readonly bool cancelImmediately; - public EveryUpdate(PlayerLoopTiming updateTiming) + public EveryUpdate(PlayerLoopTiming updateTiming, bool cancelImmediately) { this.updateTiming = updateTiming; + this.cancelImmediately = cancelImmediately; } public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) { - return new _EveryUpdate(updateTiming, cancellationToken); + return new _EveryUpdate(updateTiming, cancellationToken, cancelImmediately); } class _EveryUpdate : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem { readonly PlayerLoopTiming updateTiming; - CancellationToken cancellationToken; + readonly CancellationToken cancellationToken; + readonly CancellationTokenRegistration cancellationTokenRegistration; bool disposed; - public _EveryUpdate(PlayerLoopTiming updateTiming, CancellationToken cancellationToken) + public _EveryUpdate(PlayerLoopTiming updateTiming, CancellationToken cancellationToken, bool cancelImmediately) { this.updateTiming = updateTiming; this.cancellationToken = cancellationToken; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (_EveryUpdate)state; + source.completionSource.TrySetCanceled(source.cancellationToken); + }, this); + } + TaskTracker.TrackActiveTask(this, 2); PlayerLoopHelper.AddAction(updateTiming, this); } @@ -44,10 +56,14 @@ public _EveryUpdate(PlayerLoopTiming updateTiming, CancellationToken cancellatio public UniTask MoveNextAsync() { - // return false instead of throw - if (disposed || cancellationToken.IsCancellationRequested) return CompletedTasks.False; - + if (disposed) return CompletedTasks.False; + completionSource.Reset(); + + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + } return new UniTask(this, completionSource.Version); } @@ -55,6 +71,7 @@ public UniTask DisposeAsync() { if (!disposed) { + cancellationTokenRegistration.Dispose(); disposed = true; TaskTracker.RemoveTracking(this); } @@ -63,7 +80,13 @@ public UniTask DisposeAsync() public bool MoveNext() { - if (disposed || cancellationToken.IsCancellationRequested) + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return false; + } + + if (disposed) { completionSource.TrySetResult(false); return false; diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta index a934722d..6336e0e3 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryUpdate.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4549ba713316245a7aabc9a4df9a9828 +guid: 00520eb52e49b5b4e8d9870d6ff1aced MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs index f678e7aa..ef5739c7 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs @@ -7,7 +7,7 @@ namespace Cysharp.Threading.Tasks.Linq { public static partial class UniTaskAsyncEnumerable { - public static IUniTaskAsyncEnumerable EveryValueChanged(TTarget target, Func propertySelector, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null) + public static IUniTaskAsyncEnumerable EveryValueChanged(TTarget target, Func propertySelector, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null, bool cancelImmediately = false) where TTarget : class { var unityObject = target as UnityEngine.Object; @@ -15,11 +15,11 @@ public static IUniTaskAsyncEnumerable EveryValueChanged(target, propertySelector, equalityComparer ?? UnityEqualityComparer.GetDefault(), monitorTiming); + return new EveryValueChangedUnityObject(target, propertySelector, equalityComparer ?? UnityEqualityComparer.GetDefault(), monitorTiming, cancelImmediately); } else { - return new EveryValueChangedStandardObject(target, propertySelector, equalityComparer ?? UnityEqualityComparer.GetDefault(), monitorTiming); + return new EveryValueChangedStandardObject(target, propertySelector, equalityComparer ?? UnityEqualityComparer.GetDefault(), monitorTiming, cancelImmediately); } } } @@ -30,18 +30,20 @@ internal sealed class EveryValueChangedUnityObject : IUniTas readonly Func propertySelector; readonly IEqualityComparer equalityComparer; readonly PlayerLoopTiming monitorTiming; + readonly bool cancelImmediately; - public EveryValueChangedUnityObject(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming) + public EveryValueChangedUnityObject(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, bool cancelImmediately) { this.target = target; this.propertySelector = propertySelector; this.equalityComparer = equalityComparer; this.monitorTiming = monitorTiming; + this.cancelImmediately = cancelImmediately; } public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) { - return new _EveryValueChanged(target, propertySelector, equalityComparer, monitorTiming, cancellationToken); + return new _EveryValueChanged(target, propertySelector, equalityComparer, monitorTiming, cancellationToken, cancelImmediately); } sealed class _EveryValueChanged : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem @@ -50,13 +52,14 @@ sealed class _EveryValueChanged : MoveNextSource, IUniTaskAsyncEnumerator equalityComparer; readonly Func propertySelector; - CancellationToken cancellationToken; + readonly CancellationToken cancellationToken; + readonly CancellationTokenRegistration cancellationTokenRegistration; bool first; TProperty currentValue; bool disposed; - public _EveryValueChanged(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, CancellationToken cancellationToken) + public _EveryValueChanged(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, CancellationToken cancellationToken, bool cancelImmediately) { this.target = target; this.targetAsUnityObject = target as UnityEngine.Object; @@ -64,6 +67,16 @@ public _EveryValueChanged(TTarget target, Func propertySelec this.equalityComparer = equalityComparer; this.cancellationToken = cancellationToken; this.first = true; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (_EveryValueChanged)state; + source.completionSource.TrySetCanceled(source.cancellationToken); + }, this); + } + TaskTracker.TrackActiveTask(this, 2); PlayerLoopHelper.AddAction(monitorTiming, this); } @@ -72,8 +85,15 @@ public _EveryValueChanged(TTarget target, Func propertySelec public UniTask MoveNextAsync() { - // return false instead of throw - if (disposed || cancellationToken.IsCancellationRequested) return CompletedTasks.False; + if (disposed) return CompletedTasks.False; + + completionSource.Reset(); + + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return new UniTask(this, completionSource.Version); + } if (first) { @@ -86,7 +106,6 @@ public UniTask MoveNextAsync() return CompletedTasks.True; } - completionSource.Reset(); return new UniTask(this, completionSource.Version); } @@ -94,6 +113,7 @@ public UniTask DisposeAsync() { if (!disposed) { + cancellationTokenRegistration.Dispose(); disposed = true; TaskTracker.RemoveTracking(this); } @@ -102,13 +122,18 @@ public UniTask DisposeAsync() public bool MoveNext() { - if (disposed || cancellationToken.IsCancellationRequested || targetAsUnityObject == null) // destroyed = cancel. + if (disposed || targetAsUnityObject == null) { completionSource.TrySetResult(false); DisposeAsync().Forget(); return false; } - + + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return false; + } TProperty nextValue = default(TProperty); try { @@ -139,18 +164,20 @@ internal sealed class EveryValueChangedStandardObject : IUni readonly Func propertySelector; readonly IEqualityComparer equalityComparer; readonly PlayerLoopTiming monitorTiming; + readonly bool cancelImmediately; - public EveryValueChangedStandardObject(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming) + public EveryValueChangedStandardObject(TTarget target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, bool cancelImmediately) { this.target = new WeakReference(target, false); this.propertySelector = propertySelector; this.equalityComparer = equalityComparer; this.monitorTiming = monitorTiming; + this.cancelImmediately = cancelImmediately; } public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) { - return new _EveryValueChanged(target, propertySelector, equalityComparer, monitorTiming, cancellationToken); + return new _EveryValueChanged(target, propertySelector, equalityComparer, monitorTiming, cancellationToken, cancelImmediately); } sealed class _EveryValueChanged : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem @@ -158,19 +185,30 @@ sealed class _EveryValueChanged : MoveNextSource, IUniTaskAsyncEnumerator target; readonly IEqualityComparer equalityComparer; readonly Func propertySelector; - CancellationToken cancellationToken; + readonly CancellationToken cancellationToken; + readonly CancellationTokenRegistration cancellationTokenRegistration; bool first; TProperty currentValue; bool disposed; - public _EveryValueChanged(WeakReference target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, CancellationToken cancellationToken) + public _EveryValueChanged(WeakReference target, Func propertySelector, IEqualityComparer equalityComparer, PlayerLoopTiming monitorTiming, CancellationToken cancellationToken, bool cancelImmediately) { this.target = target; this.propertySelector = propertySelector; this.equalityComparer = equalityComparer; this.cancellationToken = cancellationToken; this.first = true; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (_EveryValueChanged)state; + source.completionSource.TrySetCanceled(source.cancellationToken); + }, this); + } + TaskTracker.TrackActiveTask(this, 2); PlayerLoopHelper.AddAction(monitorTiming, this); } @@ -179,8 +217,16 @@ public _EveryValueChanged(WeakReference target, Func MoveNextAsync() { - if (disposed || cancellationToken.IsCancellationRequested) return CompletedTasks.False; + if (disposed) return CompletedTasks.False; + completionSource.Reset(); + + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return new UniTask(this, completionSource.Version); + } + if (first) { first = false; @@ -192,7 +238,6 @@ public UniTask MoveNextAsync() return CompletedTasks.True; } - completionSource.Reset(); return new UniTask(this, completionSource.Version); } @@ -200,6 +245,7 @@ public UniTask DisposeAsync() { if (!disposed) { + cancellationTokenRegistration.Dispose(); disposed = true; TaskTracker.RemoveTracking(this); } @@ -208,13 +254,19 @@ public UniTask DisposeAsync() public bool MoveNext() { - if (disposed || cancellationToken.IsCancellationRequested || !target.TryGetTarget(out var t)) + if (disposed || !target.TryGetTarget(out var t)) { completionSource.TrySetResult(false); DisposeAsync().Forget(); return false; } + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return false; + } + TProperty nextValue = default(TProperty); try { diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta index bf818159..9d2be702 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/EveryValueChanged.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a6291ccb8ffb24a43b2213e3fadf26cb +guid: 1ec39f1c41c305344854782c935ad354 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs index 53ecfcd7..b8aabf23 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs @@ -6,32 +6,32 @@ namespace Cysharp.Threading.Tasks.Linq { public static partial class UniTaskAsyncEnumerable { - public static IUniTaskAsyncEnumerable Timer(TimeSpan dueTime, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false) + public static IUniTaskAsyncEnumerable Timer(TimeSpan dueTime, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false, bool cancelImmediately = false) { - return new Timer(dueTime, null, updateTiming, ignoreTimeScale); + return new Timer(dueTime, null, updateTiming, ignoreTimeScale, cancelImmediately); } - public static IUniTaskAsyncEnumerable Timer(TimeSpan dueTime, TimeSpan period, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false) + public static IUniTaskAsyncEnumerable Timer(TimeSpan dueTime, TimeSpan period, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false, bool cancelImmediately = false) { - return new Timer(dueTime, period, updateTiming, ignoreTimeScale); + return new Timer(dueTime, period, updateTiming, ignoreTimeScale, cancelImmediately); } - public static IUniTaskAsyncEnumerable Interval(TimeSpan period, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false) + public static IUniTaskAsyncEnumerable Interval(TimeSpan period, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool ignoreTimeScale = false, bool cancelImmediately = false) { - return new Timer(period, period, updateTiming, ignoreTimeScale); + return new Timer(period, period, updateTiming, ignoreTimeScale, cancelImmediately); } - public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) + public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) { if (dueTimeFrameCount < 0) { throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. dueTimeFrameCount:" + dueTimeFrameCount); } - return new TimerFrame(dueTimeFrameCount, null, updateTiming); + return new TimerFrame(dueTimeFrameCount, null, updateTiming, cancelImmediately); } - public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, int periodFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) + public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, int periodFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) { if (dueTimeFrameCount < 0) { @@ -42,16 +42,16 @@ public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCoun throw new ArgumentOutOfRangeException("Delay does not allow minus periodFrameCount. periodFrameCount:" + dueTimeFrameCount); } - return new TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming); + return new TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming, cancelImmediately); } - public static IUniTaskAsyncEnumerable IntervalFrame(int intervalFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) + public static IUniTaskAsyncEnumerable IntervalFrame(int intervalFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update, bool cancelImmediately = false) { if (intervalFrameCount < 0) { throw new ArgumentOutOfRangeException("Delay does not allow minus intervalFrameCount. intervalFrameCount:" + intervalFrameCount); } - return new TimerFrame(intervalFrameCount, intervalFrameCount, updateTiming); + return new TimerFrame(intervalFrameCount, intervalFrameCount, updateTiming, cancelImmediately); } } @@ -61,18 +61,20 @@ internal class Timer : IUniTaskAsyncEnumerable readonly TimeSpan dueTime; readonly TimeSpan? period; readonly bool ignoreTimeScale; + readonly bool cancelImmediately; - public Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, bool ignoreTimeScale) + public Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, bool ignoreTimeScale, bool cancelImmediately) { this.updateTiming = updateTiming; this.dueTime = dueTime; this.period = period; this.ignoreTimeScale = ignoreTimeScale; + this.cancelImmediately = cancelImmediately; } public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) { - return new _Timer(dueTime, period, updateTiming, ignoreTimeScale, cancellationToken); + return new _Timer(dueTime, period, updateTiming, ignoreTimeScale, cancellationToken, cancelImmediately); } class _Timer : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem @@ -81,7 +83,8 @@ class _Timer : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopIt readonly float? period; readonly PlayerLoopTiming updateTiming; readonly bool ignoreTimeScale; - CancellationToken cancellationToken; + readonly CancellationToken cancellationToken; + readonly CancellationTokenRegistration cancellationTokenRegistration; int initialFrame; float elapsed; @@ -89,7 +92,7 @@ class _Timer : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopIt bool completed; bool disposed; - public _Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, bool ignoreTimeScale, CancellationToken cancellationToken) + public _Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, bool ignoreTimeScale, CancellationToken cancellationToken, bool cancelImmediately) { this.dueTime = (float)dueTime.TotalSeconds; this.period = (period == null) ? null : (float?)period.Value.TotalSeconds; @@ -105,6 +108,16 @@ public _Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, this.updateTiming = updateTiming; this.ignoreTimeScale = ignoreTimeScale; this.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (_Timer)state; + source.completionSource.TrySetCanceled(source.cancellationToken); + }, this); + } + TaskTracker.TrackActiveTask(this, 2); PlayerLoopHelper.AddAction(updateTiming, this); } @@ -114,12 +127,16 @@ public _Timer(TimeSpan dueTime, TimeSpan? period, PlayerLoopTiming updateTiming, public UniTask MoveNextAsync() { // return false instead of throw - if (disposed || cancellationToken.IsCancellationRequested || completed) return CompletedTasks.False; + if (disposed || completed) return CompletedTasks.False; // reset value here. this.elapsed = 0; completionSource.Reset(); + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + } return new UniTask(this, completionSource.Version); } @@ -127,6 +144,7 @@ public UniTask DisposeAsync() { if (!disposed) { + cancellationTokenRegistration.Dispose(); disposed = true; TaskTracker.RemoveTracking(this); } @@ -135,11 +153,16 @@ public UniTask DisposeAsync() public bool MoveNext() { - if (disposed || cancellationToken.IsCancellationRequested) + if (disposed) { completionSource.TrySetResult(false); return false; } + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return false; + } if (dueTimePhase) { @@ -187,24 +210,27 @@ internal class TimerFrame : IUniTaskAsyncEnumerable readonly PlayerLoopTiming updateTiming; readonly int dueTimeFrameCount; readonly int? periodFrameCount; + readonly bool cancelImmediately; - public TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTiming updateTiming) + public TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTiming updateTiming, bool cancelImmediately) { this.updateTiming = updateTiming; this.dueTimeFrameCount = dueTimeFrameCount; this.periodFrameCount = periodFrameCount; + this.cancelImmediately = cancelImmediately; } public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) { - return new _TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming, cancellationToken); + return new _TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming, cancellationToken, cancelImmediately); } class _TimerFrame : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem { readonly int dueTimeFrameCount; readonly int? periodFrameCount; - CancellationToken cancellationToken; + readonly CancellationToken cancellationToken; + readonly CancellationTokenRegistration cancellationTokenRegistration; int initialFrame; int currentFrame; @@ -212,7 +238,7 @@ class _TimerFrame : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerL bool completed; bool disposed; - public _TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTiming updateTiming, CancellationToken cancellationToken) + public _TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTiming updateTiming, CancellationToken cancellationToken, bool cancelImmediately) { if (dueTimeFrameCount <= 0) dueTimeFrameCount = 0; if (periodFrameCount != null) @@ -225,6 +251,15 @@ public _TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTimin this.dueTimeFrameCount = dueTimeFrameCount; this.periodFrameCount = periodFrameCount; this.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (_TimerFrame)state; + source.completionSource.TrySetCanceled(source.cancellationToken); + }, this); + } TaskTracker.TrackActiveTask(this, 2); PlayerLoopHelper.AddAction(updateTiming, this); @@ -234,13 +269,15 @@ public _TimerFrame(int dueTimeFrameCount, int? periodFrameCount, PlayerLoopTimin public UniTask MoveNextAsync() { - // return false instead of throw - if (disposed || cancellationToken.IsCancellationRequested || completed) return CompletedTasks.False; + if (disposed || completed) return CompletedTasks.False; + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + } // reset value here. this.currentFrame = 0; - completionSource.Reset(); return new UniTask(this, completionSource.Version); } @@ -249,6 +286,7 @@ public UniTask DisposeAsync() { if (!disposed) { + cancellationTokenRegistration.Dispose(); disposed = true; TaskTracker.RemoveTracking(this); } @@ -257,7 +295,12 @@ public UniTask DisposeAsync() public bool MoveNext() { - if (disposed || cancellationToken.IsCancellationRequested) + if (cancellationToken.IsCancellationRequested) + { + completionSource.TrySetCanceled(cancellationToken); + return false; + } + if (disposed) { completionSource.TrySetResult(false); return false; diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta index 3c33c901..aa790c52 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 460eb5b7189dc4a588551fda0c843c0c +guid: 382caacde439855418709c641e4d7b04 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Where.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Where.cs.meta index f584c667..7e503375 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Where.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Where.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 457c94394bc9f491db1be409ee79f287 +guid: d882a3238d9535e4e8ce1ad3291eb7fb MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Linq/Zip.cs.meta b/Runtime/Plugins/UniTask/Runtime/Linq/Zip.cs.meta index f416ff8a..bf121637 100644 --- a/Runtime/Plugins/UniTask/Runtime/Linq/Zip.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Linq/Zip.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b9b9752e634e54cc5afd46a1fc51a3d9 +guid: acc1acff153e347418f0f30b1c535994 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/MoveNextSource.cs.meta b/Runtime/Plugins/UniTask/Runtime/MoveNextSource.cs.meta index 070f59f6..60a0908c 100644 --- a/Runtime/Plugins/UniTask/Runtime/MoveNextSource.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/MoveNextSource.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1811eecca84d64d8983a39c97280f9bc +guid: dc4c5dc2a5f246e4f8df44cab735826c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs b/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs index 538fc011..b17375e7 100644 --- a/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs +++ b/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs @@ -285,7 +285,11 @@ static PlayerLoopSystem[] InsertUniTaskSynchronizationContext(PlayerLoopSystem l return dest.ToArray(); } - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] +#if UNITY_2020_1_OR_NEWER + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)] +#else + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] +#endif static void Init() { // capture default(unity) sync-context. diff --git a/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs.meta b/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs.meta index 5e86f03a..2487ef77 100644 --- a/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/PlayerLoopHelper.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0335b2962570642c08350dd404b38a2f +guid: 15fb5b85042f19640b973ce651795aca MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/PlayerLoopTimer.cs.meta b/Runtime/Plugins/UniTask/Runtime/PlayerLoopTimer.cs.meta index b74a0194..eb2b50a0 100644 --- a/Runtime/Plugins/UniTask/Runtime/PlayerLoopTimer.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/PlayerLoopTimer.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dbf62f3671ef04635b86e0104dfd213d +guid: 57095a17fdca7ee4380450910afc7f26 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Progress.cs.meta b/Runtime/Plugins/UniTask/Runtime/Progress.cs.meta index 36b3139d..f0e1f197 100644 --- a/Runtime/Plugins/UniTask/Runtime/Progress.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Progress.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 04161c0a234964051abc7e7d5b778583 +guid: e3377e2ae934ed54fb8fd5388e2d9eb9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/TaskPool.cs.meta b/Runtime/Plugins/UniTask/Runtime/TaskPool.cs.meta index 28d66192..94c78058 100644 --- a/Runtime/Plugins/UniTask/Runtime/TaskPool.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/TaskPool.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aaba7ea0d91764bbcb11576ba96da45d +guid: 19f4e6575150765449cc99f25f06f25f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/TimeoutController.cs.meta b/Runtime/Plugins/UniTask/Runtime/TimeoutController.cs.meta index 4fd2a3d8..4f3d16d9 100644 --- a/Runtime/Plugins/UniTask/Runtime/TimeoutController.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/TimeoutController.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 02f3e48b6c74a4180b0a07409b0a02b3 +guid: 6347ab34d2db6d744a654e8d62d96b96 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs b/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs index 503e9db9..0b817fe3 100644 --- a/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs +++ b/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs @@ -20,8 +20,6 @@ public struct TriggerEvent { ITriggerHandler head; // head.prev is last ITriggerHandler iteratingHead; - - bool preserveRemoveSelf; ITriggerHandler iteratingNode; void LogError(Exception ex) @@ -55,18 +53,9 @@ public void SetResult(T value) Remove(h); } - if (preserveRemoveSelf) - { - preserveRemoveSelf = false; - iteratingNode = null; - var next = h.Next; - Remove(h); - h = next; - } - else - { - h = h.Next; - } + // If `h` itself is removed by OnNext, h.Next is null. + // Therefore, instead of looking at h.Next, the `iteratingNode` reference itself is replaced. + h = h == iteratingNode ? h.Next : iteratingNode; } iteratingNode = null; @@ -97,9 +86,8 @@ public void SetCanceled(CancellationToken cancellationToken) LogError(ex); } - preserveRemoveSelf = false; + var next = h == iteratingNode ? h.Next : iteratingNode; iteratingNode = null; - var next = h.Next; Remove(h); h = next; } @@ -132,9 +120,8 @@ public void SetCompleted() LogError(ex); } - preserveRemoveSelf = false; + var next = h == iteratingNode ? h.Next : iteratingNode; iteratingNode = null; - var next = h.Next; Remove(h); h = next; } @@ -167,9 +154,8 @@ public void SetError(Exception exception) LogError(ex); } - preserveRemoveSelf = false; + var next = h == iteratingNode ? h.Next : iteratingNode; iteratingNode = null; - var next = h.Next; Remove(h); h = next; } @@ -241,71 +227,65 @@ public void Remove(ITriggerHandler handler) { if (handler == null) throw new ArgumentNullException(nameof(handler)); - if (iteratingNode != null && iteratingNode == handler) + var prev = handler.Prev; + var next = handler.Next; + + if (next != null) { - // if remove self, reserve remove self after invoke completed. - preserveRemoveSelf = true; + next.Prev = prev; } - else + + if (handler == head) + { + head = next; + } + // when handler is head, prev indicate last so don't use it. + else if (prev != null) { - var prev = handler.Prev; - var next = handler.Next; + prev.Next = next; + } - if (next != null) - { - next.Prev = prev; - } + if (handler == iteratingNode) + { + iteratingNode = next; + } + if (handler == iteratingHead) + { + iteratingHead = next; + } - if (handler == head) - { - head = next; - } - else if (handler == iteratingHead) - { - iteratingHead = next; - } - else + if (head != null) + { + if (head.Prev == handler) { - // when handler is head, prev indicate last so don't use it. - if (prev != null) + if (prev != head) { - prev.Next = next; + head.Prev = prev; } - } - - if (head != null) - { - if (head.Prev == handler) + else { - if (prev != head) - { - head.Prev = prev; - } - else - { - head.Prev = null; - } + head.Prev = null; } } + } - if (iteratingHead != null) + if (iteratingHead != null) + { + if (iteratingHead.Prev == handler) { - if (iteratingHead.Prev == handler) + if (prev != iteratingHead.Prev) { - if (prev != iteratingHead.Prev) - { - iteratingHead.Prev = prev; - } - else - { - iteratingHead.Prev = null; - } + iteratingHead.Prev = prev; + } + else + { + iteratingHead.Prev = null; } } - - handler.Prev = null; - handler.Next = null; } + + handler.Prev = null; + handler.Next = null; } } } diff --git a/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs.meta b/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs.meta index c2cda166..bbd47af7 100644 --- a/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/TriggerEvent.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4a568cd293fdc48cea7ea41c3dab708b +guid: f68b22bb8f66f5c4885f9bd3c4fc43ed MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers.meta b/Runtime/Plugins/UniTask/Runtime/Triggers.meta index 9f3dddb8..3087ef85 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 422b273127a234d6399566b951b43a56 +guid: c6c24fa00de584994bf5bb4216e65ff6 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta index e3692f89..097fdb61 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncAwakeTrigger.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5d33c47137bd3493cbe7b1ad985f8986 +guid: ef2840a2586894741a0ae211b8fd669b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs index 811f9770..77c92859 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs @@ -32,13 +32,11 @@ public CancellationToken CancellationToken if (cancellationTokenSource == null) { cancellationTokenSource = new CancellationTokenSource(); + if (!awakeCalled) + { + PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, new AwakeMonitor(this)); + } } - - if (!awakeCalled) - { - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, new AwakeMonitor(this)); - } - return cancellationTokenSource.Token; } } @@ -83,7 +81,7 @@ public AwakeMonitor(AsyncDestroyTrigger trigger) public bool MoveNext() { - if (trigger.called) return false; + if (trigger.called || trigger.awakeCalled) return false; if (trigger == null) { trigger.OnDestroy(); diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta index 935bb9ab..64500494 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncDestroyTrigger.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5742c60a067f74e869a953a7a4b4c639 +guid: f4afdcb1cbadf954ba8b1cf465429e17 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta index 07d2564c..9ef06e8e 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncStartTrigger.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 878774edbea43412a9f1952e9ac8e744 +guid: b4fd0f75e54ec3d4fbcb7fc65b11646b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta index eec82c77..e101ea2d 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerBase.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8d8ae9697a29647f49513a8269f5586f +guid: 2c0c2bcee832c6641b25949c412f020f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta index f2b868b7..348783dd 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/AsyncTriggerExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bc578ccda545b42898d2c5c1bad796dd +guid: 59b61dbea1562a84fb7a38ae0a0a0f88 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta b/Runtime/Plugins/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta index 93eeb5b8..82aa6792 100644 --- a/Runtime/Plugins/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/Triggers/MonoBehaviourMessagesTriggers.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4e87de873462e4425b245b507c3174df +guid: c30655636c35c3d4da44064af3d2d9a7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.Bridge.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.Bridge.cs.meta index 63cd0dd8..6f8da804 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.Bridge.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.Bridge.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 56a7b2c90e2a44dc59d5550017d66488 +guid: bd6beac8e0ebd264e9ba246c39429c72 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs b/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs index 0986c005..7f02a1a1 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs @@ -33,14 +33,14 @@ public static YieldAwaitable Yield(PlayerLoopTiming timing) return new YieldAwaitable(timing); } - public static UniTask Yield(CancellationToken cancellationToken) + public static UniTask Yield(CancellationToken cancellationToken, bool cancelImmediately = false) { - return new UniTask(YieldPromise.Create(PlayerLoopTiming.Update, cancellationToken, out var token), token); + return new UniTask(YieldPromise.Create(PlayerLoopTiming.Update, cancellationToken, cancelImmediately, out var token), token); } - public static UniTask Yield(PlayerLoopTiming timing, CancellationToken cancellationToken) + public static UniTask Yield(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately = false) { - return new UniTask(YieldPromise.Create(timing, cancellationToken, out var token), token); + return new UniTask(YieldPromise.Create(timing, cancellationToken, cancelImmediately, out var token), token); } /// @@ -48,7 +48,7 @@ public static UniTask Yield(PlayerLoopTiming timing, CancellationToken cancellat /// public static UniTask NextFrame() { - return new UniTask(NextFramePromise.Create(PlayerLoopTiming.Update, CancellationToken.None, out var token), token); + return new UniTask(NextFramePromise.Create(PlayerLoopTiming.Update, CancellationToken.None, false, out var token), token); } /// @@ -56,25 +56,31 @@ public static UniTask NextFrame() /// public static UniTask NextFrame(PlayerLoopTiming timing) { - return new UniTask(NextFramePromise.Create(timing, CancellationToken.None, out var token), token); + return new UniTask(NextFramePromise.Create(timing, CancellationToken.None, false, out var token), token); } /// /// Similar as UniTask.Yield but guaranteed run on next frame. /// - public static UniTask NextFrame(CancellationToken cancellationToken) + public static UniTask NextFrame(CancellationToken cancellationToken, bool cancelImmediately = false) { - return new UniTask(NextFramePromise.Create(PlayerLoopTiming.Update, cancellationToken, out var token), token); + return new UniTask(NextFramePromise.Create(PlayerLoopTiming.Update, cancellationToken, cancelImmediately, out var token), token); } /// /// Similar as UniTask.Yield but guaranteed run on next frame. /// - public static UniTask NextFrame(PlayerLoopTiming timing, CancellationToken cancellationToken) + public static UniTask NextFrame(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately = false) { - return new UniTask(NextFramePromise.Create(timing, cancellationToken, out var token), token); + return new UniTask(NextFramePromise.Create(timing, cancellationToken, cancelImmediately, out var token), token); } +#if UNITY_2023_1_OR_NEWER + public static async UniTask WaitForEndOfFrame(CancellationToken cancellationToken = default) + { + await Awaitable.EndOfFrameAsync(cancellationToken); + } +#else [Obsolete("Use WaitForEndOfFrame(MonoBehaviour) instead or UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate). Equivalent for coroutine's WaitForEndOfFrame requires MonoBehaviour(runner of Coroutine).")] public static YieldAwaitable WaitForEndOfFrame() { @@ -82,14 +88,21 @@ public static YieldAwaitable WaitForEndOfFrame() } [Obsolete("Use WaitForEndOfFrame(MonoBehaviour) instead or UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate). Equivalent for coroutine's WaitForEndOfFrame requires MonoBehaviour(runner of Coroutine).")] - public static UniTask WaitForEndOfFrame(CancellationToken cancellationToken) + public static UniTask WaitForEndOfFrame(CancellationToken cancellationToken, bool cancelImmediately = false) + { + return UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate, cancellationToken, cancelImmediately); + } +#endif + + public static UniTask WaitForEndOfFrame(MonoBehaviour coroutineRunner) { - return UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate, cancellationToken); + var source = WaitForEndOfFramePromise.Create(coroutineRunner, CancellationToken.None, false, out var token); + return new UniTask(source, token); } - public static UniTask WaitForEndOfFrame(MonoBehaviour coroutineRunner, CancellationToken cancellationToken = default) + public static UniTask WaitForEndOfFrame(MonoBehaviour coroutineRunner, CancellationToken cancellationToken, bool cancelImmediately = false) { - var source = WaitForEndOfFramePromise.Create(coroutineRunner, cancellationToken, out var token); + var source = WaitForEndOfFramePromise.Create(coroutineRunner, cancellationToken, cancelImmediately, out var token); return new UniTask(source, token); } @@ -106,40 +119,50 @@ public static YieldAwaitable WaitForFixedUpdate() /// /// Same as UniTask.Yield(PlayerLoopTiming.LastFixedUpdate, cancellationToken). /// - public static UniTask WaitForFixedUpdate(CancellationToken cancellationToken) + public static UniTask WaitForFixedUpdate(CancellationToken cancellationToken, bool cancelImmediately = false) { - return UniTask.Yield(PlayerLoopTiming.LastFixedUpdate, cancellationToken); + return UniTask.Yield(PlayerLoopTiming.LastFixedUpdate, cancellationToken, cancelImmediately); } - public static UniTask DelayFrame(int delayFrameCount, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WaitForSeconds(float duration, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) + { + return Delay(Mathf.RoundToInt(1000 * duration), ignoreTimeScale, delayTiming, cancellationToken, cancelImmediately); + } + + public static UniTask WaitForSeconds(int duration, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) + { + return Delay(1000 * duration, ignoreTimeScale, delayTiming, cancellationToken, cancelImmediately); + } + + public static UniTask DelayFrame(int delayFrameCount, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { if (delayFrameCount < 0) { throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. delayFrameCount:" + delayFrameCount); } - return new UniTask(DelayFramePromise.Create(delayFrameCount, delayTiming, cancellationToken, out var token), token); + return new UniTask(DelayFramePromise.Create(delayFrameCount, delayTiming, cancellationToken, cancelImmediately, out var token), token); } - public static UniTask Delay(int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask Delay(int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay); - return Delay(delayTimeSpan, ignoreTimeScale, delayTiming, cancellationToken); + return Delay(delayTimeSpan, ignoreTimeScale, delayTiming, cancellationToken, cancelImmediately); } - public static UniTask Delay(TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask Delay(TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { var delayType = ignoreTimeScale ? DelayType.UnscaledDeltaTime : DelayType.DeltaTime; - return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken); + return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken, cancelImmediately); } - public static UniTask Delay(int millisecondsDelay, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask Delay(int millisecondsDelay, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay); - return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken); + return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken, cancelImmediately); } - public static UniTask Delay(TimeSpan delayTimeSpan, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask Delay(TimeSpan delayTimeSpan, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { if (delayTimeSpan < TimeSpan.Zero) { @@ -158,16 +181,16 @@ public static UniTask WaitForFixedUpdate(CancellationToken cancellationToken) { case DelayType.UnscaledDeltaTime: { - return new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token); + return new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, cancelImmediately, out var token), token); } case DelayType.Realtime: { - return new UniTask(DelayRealtimePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token); + return new UniTask(DelayRealtimePromise.Create(delayTimeSpan, delayTiming, cancellationToken, cancelImmediately, out var token), token); } case DelayType.DeltaTime: default: { - return new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token); + return new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, cancelImmediately, out var token), token); } } } @@ -184,13 +207,14 @@ static YieldPromise() } CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; YieldPromise() { } - public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -202,8 +226,16 @@ public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken c result = new YieldPromise(); } - result.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (YieldPromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -257,6 +289,7 @@ bool TryReturn() TaskTracker.RemoveTracking(this); core.Reset(); cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -273,14 +306,15 @@ static NextFramePromise() } int frameCount; - CancellationToken cancellationToken; UniTaskCompletionSourceCore core; + CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; NextFramePromise() { } - public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -295,6 +329,15 @@ public static IUniTaskSource Create(PlayerLoopTiming timing, CancellationToken c result.frameCount = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; result.cancellationToken = cancellationToken; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (NextFramePromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -352,6 +395,7 @@ bool TryReturn() TaskTracker.RemoveTracking(this); core.Reset(); cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -367,14 +411,15 @@ static WaitForEndOfFramePromise() TaskPool.RegisterSizeGetter(typeof(WaitForEndOfFramePromise), () => pool.Size); } - CancellationToken cancellationToken; UniTaskCompletionSourceCore core; + CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; WaitForEndOfFramePromise() { } - public static IUniTaskSource Create(MonoBehaviour coroutineRunner, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(MonoBehaviour coroutineRunner, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -388,6 +433,15 @@ public static IUniTaskSource Create(MonoBehaviour coroutineRunner, CancellationT result.cancellationToken = cancellationToken; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (WaitForEndOfFramePromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); coroutineRunner.StartCoroutine(result); @@ -429,6 +483,7 @@ bool TryReturn() core.Reset(); Reset(); // Reset Enumerator cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } @@ -477,6 +532,7 @@ static DelayFramePromise() int initialFrame; int delayFrameCount; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; int currentFrameCount; UniTaskCompletionSourceCore core; @@ -485,7 +541,7 @@ static DelayFramePromise() { } - public static IUniTaskSource Create(int delayFrameCount, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(int delayFrameCount, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -501,6 +557,15 @@ public static IUniTaskSource Create(int delayFrameCount, PlayerLoopTiming timing result.cancellationToken = cancellationToken; result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (DelayFramePromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -587,6 +652,7 @@ bool TryReturn() currentFrameCount = default; delayFrameCount = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -606,6 +672,7 @@ static DelayPromise() float delayTimeSpan; float elapsed; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -613,7 +680,7 @@ static DelayPromise() { } - public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -630,6 +697,15 @@ public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming tim result.cancellationToken = cancellationToken; result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (DelayPromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -698,6 +774,7 @@ bool TryReturn() delayTimeSpan = default; elapsed = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -717,6 +794,7 @@ static DelayIgnoreTimeScalePromise() float elapsed; int initialFrame; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -724,7 +802,7 @@ static DelayIgnoreTimeScalePromise() { } - public static IUniTaskSource Create(TimeSpan delayFrameTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(TimeSpan delayFrameTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -741,6 +819,15 @@ public static IUniTaskSource Create(TimeSpan delayFrameTimeSpan, PlayerLoopTimin result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; result.cancellationToken = cancellationToken; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (DelayIgnoreTimeScalePromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -809,6 +896,7 @@ bool TryReturn() delayFrameTimeSpan = default; elapsed = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -827,6 +915,7 @@ static DelayRealtimePromise() long delayTimeSpanTicks; ValueStopwatch stopwatch; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -834,7 +923,7 @@ static DelayRealtimePromise() { } - public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -850,6 +939,15 @@ public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming tim result.delayTimeSpanTicks = delayTimeSpan.Ticks; result.cancellationToken = cancellationToken; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (DelayRealtimePromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -914,6 +1012,7 @@ bool TryReturn() core.Reset(); stopwatch = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs.meta index dff62d41..08ce5793 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.Delay.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d55b2a4c9807b44e7b55b6fa8b601acd +guid: ecff7972251de0848b2c0fa89bbd3489 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.Factory.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.Factory.cs.meta index 75b4bf7c..31bc0c95 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.Factory.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.Factory.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b22a15a6a90f14c168eb3e7a50e1d827 +guid: 4e12b66d6b9bd7845b04a594cbe386b4 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.Run.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.Run.cs.meta index 78f51b8f..9a780aea 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.Run.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.Run.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ba0a0d1cabe6e434ea6950417d672d14 +guid: 8473162fc285a5f44bcca90f7da073e7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.Threading.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.Threading.cs.meta index 820b5da2..fa512b8c 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.Threading.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.Threading.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e34794e5f3e714777a67a19b5c73be39 +guid: 4132ea600454134439fa2c7eb931b5e6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs b/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs index 0a09fe09..b28a529e 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs @@ -9,30 +9,30 @@ namespace Cysharp.Threading.Tasks { public partial struct UniTask { - public static UniTask WaitUntil(Func predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WaitUntil(Func predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { - return new UniTask(WaitUntilPromise.Create(predicate, timing, cancellationToken, out var token), token); + return new UniTask(WaitUntilPromise.Create(predicate, timing, cancellationToken, cancelImmediately, out var token), token); } - public static UniTask WaitWhile(Func predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WaitWhile(Func predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { - return new UniTask(WaitWhilePromise.Create(predicate, timing, cancellationToken, out var token), token); + return new UniTask(WaitWhilePromise.Create(predicate, timing, cancellationToken, cancelImmediately, out var token), token); } - public static UniTask WaitUntilCanceled(CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Update) + public static UniTask WaitUntilCanceled(CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Update, bool completeImmediately = false) { - return new UniTask(WaitUntilCanceledPromise.Create(cancellationToken, timing, out var token), token); + return new UniTask(WaitUntilCanceledPromise.Create(cancellationToken, timing, completeImmediately, out var token), token); } - public static UniTask WaitUntilValueChanged(T target, Func monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WaitUntilValueChanged(T target, Func monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) where T : class { var unityObject = target as UnityEngine.Object; var isUnityObject = target is UnityEngine.Object; // don't use (unityObject == null) return new UniTask(isUnityObject - ? WaitUntilValueChangedUnityObjectPromise.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out var token) - : WaitUntilValueChangedStandardObjectPromise.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out token), token); + ? WaitUntilValueChangedUnityObjectPromise.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, cancelImmediately, out var token) + : WaitUntilValueChangedStandardObjectPromise.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, cancelImmediately, out token), token); } sealed class WaitUntilPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode @@ -48,6 +48,7 @@ static WaitUntilPromise() Func predicate; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -55,7 +56,7 @@ static WaitUntilPromise() { } - public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -70,6 +71,15 @@ public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timin result.predicate = predicate; result.cancellationToken = cancellationToken; + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (WaitUntilPromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -136,6 +146,7 @@ bool TryReturn() core.Reset(); predicate = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -153,6 +164,7 @@ static WaitWhilePromise() Func predicate; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -160,7 +172,7 @@ static WaitWhilePromise() { } - public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -174,6 +186,15 @@ public static IUniTaskSource Create(Func predicate, PlayerLoopTiming timin result.predicate = predicate; result.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (WaitWhilePromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -241,6 +262,7 @@ bool TryReturn() core.Reset(); predicate = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -257,6 +279,7 @@ static WaitUntilCanceledPromise() } CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -264,7 +287,7 @@ static WaitUntilCanceledPromise() { } - public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, out short token) + public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, bool completeImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -278,6 +301,15 @@ public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerL result.cancellationToken = cancellationToken; + if (completeImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (WaitUntilCanceledPromise)state; + promise.core.TrySetResult(null); + }, result); + } + TaskTracker.TrackActiveTask(result, 3); PlayerLoopHelper.AddAction(timing, result); @@ -329,6 +361,7 @@ bool TryReturn() TaskTracker.RemoveTracking(this); core.Reset(); cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -351,6 +384,7 @@ static WaitUntilValueChangedUnityObjectPromise() Func monitorFunction; IEqualityComparer equalityComparer; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -358,7 +392,7 @@ static WaitUntilValueChangedUnityObjectPromise() { } - public static IUniTaskSource Create(T target, Func monitorFunction, IEqualityComparer equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(T target, Func monitorFunction, IEqualityComparer equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -376,6 +410,15 @@ public static IUniTaskSource Create(T target, Func monitorFunction, IEq result.currentValue = monitorFunction(target); result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); result.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (WaitUntilValueChangedUnityObjectPromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -453,6 +496,7 @@ bool TryReturn() monitorFunction = default; equalityComparer = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } @@ -474,6 +518,7 @@ static WaitUntilValueChangedStandardObjectPromise() Func monitorFunction; IEqualityComparer equalityComparer; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; @@ -481,7 +526,7 @@ static WaitUntilValueChangedStandardObjectPromise() { } - public static IUniTaskSource Create(T target, Func monitorFunction, IEqualityComparer equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(T target, Func monitorFunction, IEqualityComparer equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -498,6 +543,15 @@ public static IUniTaskSource Create(T target, Func monitorFunction, IEq result.currentValue = monitorFunction(target); result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); result.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (WaitUntilValueChangedStandardObjectPromise)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -575,6 +629,7 @@ bool TryReturn() monitorFunction = default; equalityComparer = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs.meta index 1d9866c0..6e64dc7e 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 105f0aa718bb445e5892d0d6ff7cd388 +guid: 87c9c533491903a4288536b5ac173db8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta index e0e0e75f..40ed46cd 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.Generated.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 63d24329e6e564fecbea4aefe648a594 +guid: 5110117231c8a6d4095fd0cbd3f4c142 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.cs.meta index 75abd429..0366aa87 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAll.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 62395c67ba241456398e649f706405d4 +guid: 355997a305ba64248822eec34998a1a0 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta index 1ce8dad4..49a2c3fd 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a3f82964c46c44ee79588e5f44931547 +guid: 13d604ac281570c4eac9962429f19ca9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.cs.meta index 2cf0be15..c10f7621 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.WhenAny.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7e70941ad86204bc899e05346d88d66e +guid: c32578978c37eaf41bdd90e1b034637d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.asmdef.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.asmdef.meta index 362a4269..e497045e 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.asmdef.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1eaf7438b68a141a39da26d98b990fe7 +guid: f51ebe6a0ceec4240a699833d6309b23 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins/UniTask/Runtime/UniTask.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTask.cs.meta index 3d755cef..04eb6b64 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTask.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTask.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2292a17cf34064e31a92fb93723f5e28 +guid: 8947adf23181ff04db73829df217ca94 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs b/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs index 67b882ee..bf2d054b 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs @@ -137,8 +137,8 @@ public bool TrySetResult(TResult result) if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null) { continuation(continuationState); - return true; } + return true; } return false; @@ -165,8 +165,8 @@ public bool TrySetException(Exception error) if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null) { continuation(continuationState); - return true; } + return true; } return false; @@ -184,8 +184,8 @@ public bool TrySetCanceled(CancellationToken cancellationToken = default) if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null) { continuation(continuationState); - return true; } + return true; } return false; @@ -328,6 +328,7 @@ static AutoResetUniTaskCompletionSource() } UniTaskCompletionSourceCore core; + short version; AutoResetUniTaskCompletionSource() { @@ -340,6 +341,7 @@ public static AutoResetUniTaskCompletionSource Create() { result = new AutoResetUniTaskCompletionSource(); } + result.version = result.core.Version; TaskTracker.TrackActiveTask(result, 2); return result; } @@ -383,19 +385,19 @@ public UniTask Task [DebuggerHidden] public bool TrySetResult() { - return core.TrySetResult(AsyncUnit.Default); + return version == core.Version && core.TrySetResult(AsyncUnit.Default); } [DebuggerHidden] public bool TrySetCanceled(CancellationToken cancellationToken = default) { - return core.TrySetCanceled(cancellationToken); + return version == core.Version && core.TrySetCanceled(cancellationToken); } [DebuggerHidden] public bool TrySetException(Exception exception) { - return core.TrySetException(exception); + return version == core.Version && core.TrySetException(exception); } [DebuggerHidden] @@ -409,7 +411,6 @@ public void GetResult(short token) { TryReturn(); } - } [DebuggerHidden] @@ -451,6 +452,7 @@ static AutoResetUniTaskCompletionSource() } UniTaskCompletionSourceCore core; + short version; AutoResetUniTaskCompletionSource() { @@ -463,6 +465,7 @@ public static AutoResetUniTaskCompletionSource Create() { result = new AutoResetUniTaskCompletionSource(); } + result.version = result.core.Version; TaskTracker.TrackActiveTask(result, 2); return result; } @@ -506,19 +509,19 @@ public UniTask Task [DebuggerHidden] public bool TrySetResult(T result) { - return core.TrySetResult(result); + return version == core.Version && core.TrySetResult(result); } [DebuggerHidden] public bool TrySetCanceled(CancellationToken cancellationToken = default) { - return core.TrySetCanceled(cancellationToken); + return version == core.Version && core.TrySetCanceled(cancellationToken); } [DebuggerHidden] public bool TrySetException(Exception exception) { - return core.TrySetException(exception); + return version == core.Version && core.TrySetException(exception); } [DebuggerHidden] @@ -937,5 +940,5 @@ bool TrySignalCompletion(UniTaskStatus status) } return false; } - } + } } \ No newline at end of file diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs.meta index 4e296796..2ae5ee31 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d2de3e742160f4b3099b82e0938880ae +guid: ed03524d09e7eb24a9fb9137198feb84 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta index 1b2911d2..e2dcc142 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.Shorthand.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8f80f81470bd04fdeaf83a58ec68f1b2 +guid: 4b4ff020f73dc6d4b8ebd4760d61fb43 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs b/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs index d3301090..362da525 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs @@ -28,7 +28,7 @@ public static UniTask AsUniTask(this Task task, bool useCurrentSynchron p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception); + p.TrySetException(x.Exception.InnerException ?? x.Exception); break; case TaskStatus.RanToCompletion: p.TrySetResult(x.Result); @@ -58,7 +58,7 @@ public static UniTask AsUniTask(this Task task, bool useCurrentSynchronizationCo p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception); + p.TrySetException(x.Exception.InnerException ?? x.Exception); break; case TaskStatus.RanToCompletion: p.TrySetResult(); diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs.meta index e89832a3..0d229460 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 770f42f432e4446919a47f840e9f94ea +guid: 05460c617dae1e440861a7438535389f MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskObservableExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskObservableExtensions.cs.meta index 62ca487f..527a49fc 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskObservableExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskObservableExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5a4329d381aa84f4482492b78f65d59d +guid: eaea262a5ad393d419c15b3b2901d664 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskScheduler.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskScheduler.cs.meta index 5614edbf..5e29191f 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskScheduler.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskScheduler.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ea016913e101c474db1ac0877cd5efb8 +guid: d6cad69921702d5488d96b5ef30df1b0 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta index 30665c1b..9828c893 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskSynchronizationContext.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f900f25aeddc84a1580fb97c9ca34d40 +guid: abf3aae9813db2849bce518f8596e920 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UniTaskVoid.cs.meta b/Runtime/Plugins/UniTask/Runtime/UniTaskVoid.cs.meta index b574c381..01f7156c 100644 --- a/Runtime/Plugins/UniTask/Runtime/UniTaskVoid.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UniTaskVoid.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7d5192eb897614e43aa375973f381595 +guid: e9f28cd922179634d863011548f89ae7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs index 1a1e011f..5d34692d 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs @@ -24,12 +24,17 @@ public static AssetBundleRequestAllAssetsAwaiter AwaitForAllAssets(this AssetBun return AwaitForAllAssets(asyncOperation, null, PlayerLoopTiming.Update, cancellationToken: cancellationToken); } - public static UniTask AwaitForAllAssets(this AssetBundleRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask AwaitForAllAssets(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) + { + return AwaitForAllAssets(asyncOperation, progress: null, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask AwaitForAllAssets(this AssetBundleRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.allAssets); - return new UniTask(AssetBundleRequestAllAssetsConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token); + return new UniTask(AssetBundleRequestAllAssetsConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct AssetBundleRequestAllAssetsAwaiter : ICriticalNotifyCompletion @@ -95,15 +100,19 @@ static AssetBundleRequestAllAssetsConfiguredSource() AssetBundleRequest asyncOperation; IProgress progress; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; + bool completed; UniTaskCompletionSourceCore core; + Action continuationAction; + AssetBundleRequestAllAssetsConfiguredSource() { - + continuationAction = Continuation; } - public static IUniTaskSource Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -118,6 +127,18 @@ static AssetBundleRequestAllAssetsConfiguredSource() result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.completed = false; + + asyncOperation.completed += result.continuationAction; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (AssetBundleRequestAllAssetsConfiguredSource)state; + source.core.TrySetCanceled(source.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -161,6 +182,12 @@ public void OnCompleted(Action continuation, object state, short token) public bool MoveNext() { + // Already completed + if (completed || asyncOperation == null) + { + return false; + } + if (cancellationToken.IsCancellationRequested) { core.TrySetCanceled(cancellationToken); @@ -188,8 +215,29 @@ bool TryReturn() asyncOperation = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } + + void Continuation(AsyncOperation _) + { + if (completed) + { + TryReturn(); + } + else + { + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else + { + core.TrySetResult(asyncOperation.allAssets); + } + } + } } } } diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta index e49184c5..79be9231 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a97902fd5529c452cbbc5f3b92d22a85 +guid: e9147caba40da434da95b39709c13784 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs index 5805dbb1..5d73dc1a 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs @@ -20,12 +20,17 @@ public static UniTask WithCancellation(this AsyncGPURea return ToUniTask(asyncOperation, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this AsyncGPUReadbackRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) { - if (asyncOperation.done) return UniTask.FromResult(asyncOperation); - return new UniTask(AsyncGPUReadbackRequestAwaiterConfiguredSource.Create(asyncOperation, timing, cancellationToken, out var token), token); + return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); } + public static UniTask ToUniTask(this AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) + { + if (asyncOperation.done) return UniTask.FromResult(asyncOperation); + return new UniTask(AsyncGPUReadbackRequestAwaiterConfiguredSource.Create(asyncOperation, timing, cancellationToken, cancelImmediately, out var token), token); + } + sealed class AsyncGPUReadbackRequestAwaiterConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode { static TaskPool pool; @@ -39,15 +44,15 @@ static AsyncGPUReadbackRequestAwaiterConfiguredSource() AsyncGPUReadbackRequest asyncOperation; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; UniTaskCompletionSourceCore core; AsyncGPUReadbackRequestAwaiterConfiguredSource() { - } - public static IUniTaskSource Create(AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -61,6 +66,15 @@ public static IUniTaskSource Create(AsyncGPUReadbackReq result.asyncOperation = asyncOperation; result.cancellationToken = cancellationToken; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var promise = (AsyncGPUReadbackRequestAwaiterConfiguredSource)state; + promise.core.TrySetCanceled(promise.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -131,6 +145,7 @@ bool TryReturn() core.Reset(); asyncOperation = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } } diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta index daf1c87f..510c49e3 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dfe829dd6f48342f487c01bade402417 +guid: 98f5fedb44749ab4688674d79126b46a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta index 7390ffbc..c07df0b8 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.Jobs.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ece57d271825444c8b1d758485529d0a +guid: 30979a768fbd4b94f8694eee8a305c99 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta index 8e2f0913..6e45863f 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.MonoBehaviour.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0540c6e1f9f7b42fd8962098f30e244d +guid: 2edd588bb09eb0a4695d039d6a1f02b2 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs index 2f726041..b9cd1c9f 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs @@ -17,7 +17,6 @@ public static partial class UnityAsyncExtensions #if !UNITY_2023_1_OR_NEWER // from Unity2023.1.0a15, AsyncOperationAwaitableExtensions.GetAwaiter is defined in UnityEngine. - public static AsyncOperationAwaiter GetAwaiter(this AsyncOperation asyncOperation) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); @@ -30,12 +29,17 @@ public static UniTask WithCancellation(this AsyncOperation asyncOperation, Cance return ToUniTask(asyncOperation, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this AsyncOperation asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this AsyncOperation asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this AsyncOperation asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); if (asyncOperation.isDone) return UniTask.CompletedTask; - return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token); + return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct AsyncOperationAwaiter : ICriticalNotifyCompletion @@ -92,15 +96,19 @@ static AsyncOperationConfiguredSource() AsyncOperation asyncOperation; IProgress progress; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; + bool completed; UniTaskCompletionSourceCore core; + Action continuationAction; + AsyncOperationConfiguredSource() { - + continuationAction = Continuation; } - public static IUniTaskSource Create(AsyncOperation asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AsyncOperation asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -115,6 +123,18 @@ public static IUniTaskSource Create(AsyncOperation asyncOperation, PlayerLoopTim result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.completed = false; + + asyncOperation.completed += result.continuationAction; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (AsyncOperationConfiguredSource)state; + source.core.TrySetCanceled(source.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -154,6 +174,12 @@ public void OnCompleted(Action continuation, object state, short token) public bool MoveNext() { + // Already completed + if (completed || asyncOperation == null) + { + return false; + } + if (cancellationToken.IsCancellationRequested) { core.TrySetCanceled(cancellationToken); @@ -178,11 +204,33 @@ bool TryReturn() { TaskTracker.RemoveTracking(this); core.Reset(); + asyncOperation.completed -= continuationAction; asyncOperation = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } + + void Continuation(AsyncOperation _) + { + if (completed) + { + TryReturn(); + } + else + { + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else + { + core.TrySetResult(AsyncUnit.Default); + } + } + } } #endregion @@ -200,12 +248,17 @@ public static ResourceRequestAwaiter GetAwaiter(this ResourceRequest asyncOperat return ToUniTask(asyncOperation, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this ResourceRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this ResourceRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this ResourceRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset); - return new UniTask(ResourceRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token); + return new UniTask(ResourceRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct ResourceRequestAwaiter : ICriticalNotifyCompletion @@ -266,15 +319,19 @@ static ResourceRequestConfiguredSource() ResourceRequest asyncOperation; IProgress progress; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; + bool completed; UniTaskCompletionSourceCore core; + Action continuationAction; + ResourceRequestConfiguredSource() { - + continuationAction = Continuation; } - public static IUniTaskSource Create(ResourceRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(ResourceRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -289,6 +346,18 @@ static ResourceRequestConfiguredSource() result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.completed = false; + + asyncOperation.completed += result.continuationAction; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (ResourceRequestConfiguredSource)state; + source.core.TrySetCanceled(source.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -332,6 +401,12 @@ public void OnCompleted(Action continuation, object state, short token) public bool MoveNext() { + // Already completed + if (completed || asyncOperation == null) + { + return false; + } + if (cancellationToken.IsCancellationRequested) { core.TrySetCanceled(cancellationToken); @@ -356,11 +431,33 @@ bool TryReturn() { TaskTracker.RemoveTracking(this); core.Reset(); + asyncOperation.completed -= continuationAction; asyncOperation = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } + + void Continuation(AsyncOperation _) + { + if (completed) + { + TryReturn(); + } + else + { + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else + { + core.TrySetResult(asyncOperation.asset); + } + } + } } #endregion @@ -379,12 +476,17 @@ public static AssetBundleRequestAwaiter GetAwaiter(this AssetBundleRequest async return ToUniTask(asyncOperation, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this AssetBundleRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this AssetBundleRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset); - return new UniTask(AssetBundleRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token); + return new UniTask(AssetBundleRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct AssetBundleRequestAwaiter : ICriticalNotifyCompletion @@ -445,15 +547,19 @@ static AssetBundleRequestConfiguredSource() AssetBundleRequest asyncOperation; IProgress progress; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; + bool completed; UniTaskCompletionSourceCore core; + Action continuationAction; + AssetBundleRequestConfiguredSource() { - + continuationAction = Continuation; } - public static IUniTaskSource Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -468,6 +574,18 @@ static AssetBundleRequestConfiguredSource() result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.completed = false; + + asyncOperation.completed += result.continuationAction; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (AssetBundleRequestConfiguredSource)state; + source.core.TrySetCanceled(source.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -511,6 +629,12 @@ public void OnCompleted(Action continuation, object state, short token) public bool MoveNext() { + // Already completed + if (completed || asyncOperation == null) + { + return false; + } + if (cancellationToken.IsCancellationRequested) { core.TrySetCanceled(cancellationToken); @@ -535,11 +659,33 @@ bool TryReturn() { TaskTracker.RemoveTracking(this); core.Reset(); + asyncOperation.completed -= continuationAction; asyncOperation = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } + + void Continuation(AsyncOperation _) + { + if (completed) + { + TryReturn(); + } + else + { + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else + { + core.TrySetResult(asyncOperation.asset); + } + } + } } #endregion @@ -559,12 +705,17 @@ public static UniTask WithCancellation(this AssetBundleCreateReques return ToUniTask(asyncOperation, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this AssetBundleCreateRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this AssetBundleCreateRequest asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this AssetBundleCreateRequest asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.assetBundle); - return new UniTask(AssetBundleCreateRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token); + return new UniTask(AssetBundleCreateRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct AssetBundleCreateRequestAwaiter : ICriticalNotifyCompletion @@ -625,15 +776,19 @@ static AssetBundleCreateRequestConfiguredSource() AssetBundleCreateRequest asyncOperation; IProgress progress; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; + bool completed; UniTaskCompletionSourceCore core; + Action continuationAction; + AssetBundleCreateRequestConfiguredSource() { - + continuationAction = Continuation; } - public static IUniTaskSource Create(AssetBundleCreateRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(AssetBundleCreateRequest asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -648,6 +803,18 @@ public static IUniTaskSource Create(AssetBundleCreateRequest asyncO result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.completed = false; + + asyncOperation.completed += result.continuationAction; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (AssetBundleCreateRequestConfiguredSource)state; + source.core.TrySetCanceled(source.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -691,6 +858,12 @@ public void OnCompleted(Action continuation, object state, short token) public bool MoveNext() { + // Already completed + if (completed || asyncOperation == null) + { + return false; + } + if (cancellationToken.IsCancellationRequested) { core.TrySetCanceled(cancellationToken); @@ -715,11 +888,33 @@ bool TryReturn() { TaskTracker.RemoveTracking(this); core.Reset(); + asyncOperation.completed -= continuationAction; asyncOperation = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } + + void Continuation(AsyncOperation _) + { + if (completed) + { + TryReturn(); + } + else + { + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else + { + core.TrySetResult(asyncOperation.assetBundle); + } + } + } } #endregion @@ -739,7 +934,12 @@ public static UniTask WithCancellation(this UnityWebRequestAsyn return ToUniTask(asyncOperation, cancellationToken: cancellationToken); } - public static UniTask ToUniTask(this UnityWebRequestAsyncOperation asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken)) + public static UniTask WithCancellation(this UnityWebRequestAsyncOperation asyncOperation, CancellationToken cancellationToken, bool cancelImmediately) + { + return ToUniTask(asyncOperation, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately); + } + + public static UniTask ToUniTask(this UnityWebRequestAsyncOperation asyncOperation, IProgress progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false) { Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation)); if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken); @@ -751,7 +951,7 @@ public static UniTask WithCancellation(this UnityWebRequestAsyn } return UniTask.FromResult(asyncOperation.webRequest); } - return new UniTask(UnityWebRequestAsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token); + return new UniTask(UnityWebRequestAsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token); } public struct UnityWebRequestAsyncOperationAwaiter : ICriticalNotifyCompletion @@ -820,15 +1020,19 @@ static UnityWebRequestAsyncOperationConfiguredSource() UnityWebRequestAsyncOperation asyncOperation; IProgress progress; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationTokenRegistration; + bool completed; UniTaskCompletionSourceCore core; + Action continuationAction; + UnityWebRequestAsyncOperationConfiguredSource() { - + continuationAction = Continuation; } - public static IUniTaskSource Create(UnityWebRequestAsyncOperation asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, out short token) + public static IUniTaskSource Create(UnityWebRequestAsyncOperation asyncOperation, PlayerLoopTiming timing, IProgress progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -843,6 +1047,19 @@ public static IUniTaskSource Create(UnityWebRequestAsyncOperati result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.completed = false; + + asyncOperation.completed += result.continuationAction; + + if (cancelImmediately && cancellationToken.CanBeCanceled) + { + result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => + { + var source = (UnityWebRequestAsyncOperationConfiguredSource)state; + source.asyncOperation.webRequest.Abort(); + source.core.TrySetCanceled(source.cancellationToken); + }, result); + } TaskTracker.TrackActiveTask(result, 3); @@ -886,6 +1103,12 @@ public void OnCompleted(Action continuation, object state, short token) public bool MoveNext() { + // Already completed + if (completed || asyncOperation == null) + { + return false; + } + if (cancellationToken.IsCancellationRequested) { asyncOperation.webRequest.Abort(); @@ -918,11 +1141,37 @@ bool TryReturn() { TaskTracker.RemoveTracking(this); core.Reset(); + asyncOperation.completed -= continuationAction; asyncOperation = default; progress = default; cancellationToken = default; + cancellationTokenRegistration.Dispose(); return pool.TryPush(this); } + + void Continuation(AsyncOperation _) + { + if (completed) + { + TryReturn(); + } + else + { + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else if (asyncOperation.webRequest.IsError()) + { + core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); + } + else + { + core.TrySetResult(asyncOperation.webRequest); + } + } + } } #endregion diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs.meta index bb22f53b..6dfab815 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c406bc570a700426c8b2d45162fb1ff6 +guid: 8cc7fd65dd1433e419be4764aeb51391 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta index 50a86f9c..90c5d515 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityAsyncExtensions.uGUI.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fb7ea1b03263e43f9bc5b96f99a21a89 +guid: 6804799fba2376d4099561d176101aff MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs b/Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs new file mode 100644 index 00000000..4580da3a --- /dev/null +++ b/Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs @@ -0,0 +1,17 @@ +#if UNITY_2023_1_OR_NEWER +namespace Cysharp.Threading.Tasks +{ + public static class UnityAwaitableExtensions + { + public static async UniTask AsUniTask(this UnityEngine.Awaitable awaitable) + { + await awaitable; + } + + public static async UniTask AsUniTask(this UnityEngine.Awaitable awaitable) + { + return await awaitable; + } + } +} +#endif diff --git a/Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs.meta new file mode 100644 index 00000000..08752a42 --- /dev/null +++ b/Runtime/Plugins/UniTask/Runtime/UnityAwaitableExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c29533c9e4284dee914b71a6579ea274 +timeCreated: 1698895807 \ No newline at end of file diff --git a/Runtime/Plugins/UniTask/Runtime/UnityBindingExtensions.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityBindingExtensions.cs.meta index cea56643..3fae798e 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityBindingExtensions.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityBindingExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d6e448df71d364546933113cf36d2a3a +guid: 090b20e3528552b4a8d751f7df525c2b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/UnityWebRequestException.cs.meta b/Runtime/Plugins/UniTask/Runtime/UnityWebRequestException.cs.meta index e2ae831d..50c475e8 100644 --- a/Runtime/Plugins/UniTask/Runtime/UnityWebRequestException.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/UnityWebRequestException.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 805d9fd994c6949929954ed327d11c49 +guid: 013a499e522703a42962a779b4d9850c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/Runtime/_InternalVisibleTo.cs.meta b/Runtime/Plugins/UniTask/Runtime/_InternalVisibleTo.cs.meta index 23e36f66..2ec6cd36 100644 --- a/Runtime/Plugins/UniTask/Runtime/_InternalVisibleTo.cs.meta +++ b/Runtime/Plugins/UniTask/Runtime/_InternalVisibleTo.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 66fa2c3768fc44331886fb34605bf111 +guid: 8507e97eb606fad4b99c6edf92e19cb8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Plugins/UniTask/package.json b/Runtime/Plugins/UniTask/package.json index 1aa6355b..84b5b0a3 100644 --- a/Runtime/Plugins/UniTask/package.json +++ b/Runtime/Plugins/UniTask/package.json @@ -1,20 +1,12 @@ { - "name": "com.cysharp.unitask", - "displayName": "UniTask", - "author": { - "name": "Cysharp, Inc.", - "url": "https://cysharp.co.jp/en/" - }, - "version": "2.3.3", - "unity": "2018.4", - "description": "Provides an efficient async/await integration to Unity.", - "keywords": [ - "async/await", - "async", - "Task", - "UniTask" - ], - "license": "MIT", - "category": "Task", - "dependencies": {} + "name": "com.cysharp.unitask", + "displayName": "UniTask", + "author": { "name": "Cysharp, Inc.", "url": "https://cysharp.co.jp/en/" }, + "version": "2.5.0", + "unity": "2018.4", + "description": "Provides an efficient async/await integration to Unity.", + "keywords": [ "async/await", "async", "Task", "UniTask" ], + "license": "MIT", + "category": "Task", + "dependencies": {} } diff --git a/Runtime/codebase/DeepLinkWallets/PhantomDeepLink.cs b/Runtime/codebase/DeepLinkWallets/PhantomDeepLink.cs index 4d1c9447..54c89489 100644 --- a/Runtime/codebase/DeepLinkWallets/PhantomDeepLink.cs +++ b/Runtime/codebase/DeepLinkWallets/PhantomDeepLink.cs @@ -112,6 +112,7 @@ private RpcCluster GetCluster() RpcCluster.DevNet => RpcCluster.DevNet, RpcCluster.TestNet => RpcCluster.TestNet, RpcCluster.MainNet => RpcCluster.MainNet, + RpcCluster.LocalNet => RpcCluster.LocalNet, _ => RpcCluster.MainNet }; } diff --git a/Runtime/codebase/DeepLinkWallets/Utils.cs b/Runtime/codebase/DeepLinkWallets/Utils.cs index 45eb7d72..3996c5e4 100644 --- a/Runtime/codebase/DeepLinkWallets/Utils.cs +++ b/Runtime/codebase/DeepLinkWallets/Utils.cs @@ -124,6 +124,7 @@ private static string GetClusterString(RpcCluster rpcCluster) RpcCluster.MainNet => "mainnet-beta", RpcCluster.DevNet => "devnet", RpcCluster.TestNet => "testnet", + RpcCluster.LocalNet => "localnet", _ => "mainnet-beta" }; } diff --git a/Runtime/codebase/SolanaMobileStack/LocalAssociationScenario.cs b/Runtime/codebase/SolanaMobileStack/LocalAssociationScenario.cs index a9e86fc6..1db054f2 100644 --- a/Runtime/codebase/SolanaMobileStack/LocalAssociationScenario.cs +++ b/Runtime/codebase/SolanaMobileStack/LocalAssociationScenario.cs @@ -41,7 +41,6 @@ public LocalAssociationScenario(int clientTimeoutMs = 9000) _didConnect = true; var helloReq = _session.CreateHelloReq(); _webSocket.Send(helloReq); - _webSocket.DispatchMessageQueue(); ListenKeyExchange(); }; _webSocket.OnClose += (e) => @@ -91,7 +90,6 @@ private async void ListenKeyExchange() { while (!_handledEncryptedMessage) { - _webSocket.DispatchMessageQueue(); var timeDelta = TimeSpan.FromMilliseconds(300); await Task.Delay(timeDelta); } diff --git a/Runtime/codebase/SolanaMobileStack/MobileWalletAdapterWebSocket.cs b/Runtime/codebase/SolanaMobileStack/MobileWalletAdapterWebSocket.cs index 89c47908..0272b484 100644 --- a/Runtime/codebase/SolanaMobileStack/MobileWalletAdapterWebSocket.cs +++ b/Runtime/codebase/SolanaMobileStack/MobileWalletAdapterWebSocket.cs @@ -21,6 +21,5 @@ public void Send(byte[] message) throw new ArgumentException("Message cannot be null or empty"); var encryptedMessage = _session.EncryptSessionPayload(message); _webSocket.Send(encryptedMessage); - _webSocket.DispatchMessageQueue(); } } \ No newline at end of file diff --git a/Runtime/codebase/WalletBase.cs b/Runtime/codebase/WalletBase.cs index be6a86a6..ab7835a3 100644 --- a/Runtime/codebase/WalletBase.cs +++ b/Runtime/codebase/WalletBase.cs @@ -21,7 +21,8 @@ public enum RpcCluster { MainNet = 0, DevNet = 1, - TestNet = 2 + TestNet = 2, + LocalNet = 3 } public abstract class WalletBase : IWalletBase @@ -36,7 +37,8 @@ public abstract class WalletBase : IWalletBase { { 0, Cluster.MainNet }, { 1, Cluster.DevNet }, - { 2, Cluster.TestNet } + { 2, Cluster.TestNet }, + { 3, Cluster.LocalNet } }; protected readonly Dictionary RPCNameMap = new () @@ -44,7 +46,7 @@ public abstract class WalletBase : IWalletBase { 0, "mainnet-beta" }, { 1, "devnet" }, { 2, "testnet" }, - { 3, "mainnet-beta" }, + { 3, "localnet" }, }; protected readonly string CustomRpcUri; diff --git a/Runtime/codebase/Web3.cs b/Runtime/codebase/Web3.cs index d68e732a..e95a2d12 100644 --- a/Runtime/codebase/Web3.cs +++ b/Runtime/codebase/Web3.cs @@ -107,6 +107,7 @@ public static event WalletChange OnWalletChangeState public static Action OnLogin; public static Action OnLogout; + public static Action OnWebSocketConnect; private static double _solAmount = 0; public delegate void BalanceChange(double sol); @@ -331,7 +332,7 @@ public static Task BlockHash( /// Notify all registered listeners /// /// - public static async UniTask UpdateBalance(Commitment commitment = Commitment.Confirmed) + public static async UniTask UpdateBalance(Commitment commitment = Commitment.Processed) { if (Instance == null || Instance.WalletBase == null) return; @@ -345,7 +346,7 @@ public static async UniTask UpdateBalance(Commitment commitment = Commitment.Con /// Notify all registered listeners /// /// - public static async UniTask UpdateNFTs(Commitment commitment = Commitment.Confirmed) + public static async UniTask UpdateNFTs(Commitment commitment = Commitment.Processed) { if(_isLoadingNfts) return; _isLoadingNfts = true; @@ -365,7 +366,7 @@ public static async UniTask UpdateNFTs(Commitment commitment = Commitment.Confir bool loadTexture = true, bool notifyRegisteredListeners = true, int requestsMillisecondsDelay = 0, - Commitment commitment = Commitment.Confirmed) + Commitment commitment = Commitment.Processed) { loadTexture = LoadNftsTextureByDefault ?? loadTexture; if(Wallet == null) return null; @@ -416,7 +417,7 @@ public static async UniTask UpdateNFTs(Commitment commitment = Commitment.Confir requestsMillisecondsDelay = Mathf.Max(requestsMillisecondsDelay, 100, NftLoadingRequestsDelay); } if (requestsMillisecondsDelay > 0) await UniTask.Delay(requestsMillisecondsDelay); - + await UniTask.SwitchToMainThread(); var tNft = Nft.Nft.TryGetNftData(item.Account.Data.Parsed.Info.Mint, Rpc, loadTexture: loadTexture).AsUniTask(); loadingTasks.Add(tNft); tNft.ContinueWith(nft => @@ -437,10 +438,11 @@ public static async UniTask UpdateNFTs(Commitment commitment = Commitment.Confir return nfts; } - private static async UniTask SubscribeToWalletEvents(Commitment commitment = Commitment.Confirmed) + private static async UniTask SubscribeToWalletEvents(Commitment commitment = Commitment.Processed) { if(WsRpc == null) return; await Wallet.AwaitWsRpcConnection(); + OnWebSocketConnect?.Invoke(); await WsRpc.SubscribeAccountInfoAsync( Account.PublicKey, (_, accountInfo) => diff --git a/Samples~/Solana Wallet/Scenes/wallet_scene.unity b/Samples~/Solana Wallet/Scenes/wallet_scene.unity index ebc4598f..7e05e0ac 100644 --- a/Samples~/Solana Wallet/Scenes/wallet_scene.unity +++ b/Samples~/Solana Wallet/Scenes/wallet_scene.unity @@ -104,7 +104,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 3 + serializedVersion: 2 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -117,7 +117,7 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - buildHeightMesh: 0 + accuratePlacement: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -154,17 +154,9 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -368,7 +360,6 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 175970951105407052, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} @@ -423,6 +414,10 @@ PrefabInstance: propertyPath: m_AnchoredPosition.y value: 0 objectReference: {fileID: 0} + - target: {fileID: 1336760630763171628, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.13024902 + objectReference: {fileID: 0} - target: {fileID: 1386163264363631060, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} propertyPath: m_AnchoredPosition.y value: 0 @@ -493,7 +488,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3211121489190443638, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -34 objectReference: {fileID: 0} - target: {fileID: 3389550029039025430, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} propertyPath: m_AnchoredPosition.y @@ -695,6 +690,10 @@ PrefabInstance: propertyPath: m_AnchoredPosition.y value: 0 objectReference: {fileID: 0} + - target: {fileID: 5707216438012718698, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} + propertyPath: m_AnchoredPosition.x + value: -4.499756 + objectReference: {fileID: 0} - target: {fileID: 5707216438012718698, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} propertyPath: m_AnchoredPosition.y value: 0 @@ -940,16 +939,12 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 51b19f34b566aa04ea3325e5810f314c, type: 3} --- !u!1001 &6943455501189903268 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 6943455501282507180, guid: f43ecbac77afa435bacb53e2b24a8907, type: 3} @@ -1066,7 +1061,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6943455502497181191, guid: f43ecbac77afa435bacb53e2b24a8907, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: 22 objectReference: {fileID: 0} - target: {fileID: 6943455502520650084, guid: f43ecbac77afa435bacb53e2b24a8907, type: 3} propertyPath: m_AnchoredPosition.y @@ -1081,7 +1076,4 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: f43ecbac77afa435bacb53e2b24a8907, type: 3} diff --git a/Samples~/Solana Wallet/Scripts/example/screens/WalletScreen.cs b/Samples~/Solana Wallet/Scripts/example/screens/WalletScreen.cs index 66ed49c2..f0b64352 100644 --- a/Samples~/Solana Wallet/Scripts/example/screens/WalletScreen.cs +++ b/Samples~/Solana Wallet/Scripts/example/screens/WalletScreen.cs @@ -151,7 +151,7 @@ private async UniTask GetOwnedTokenAccounts() { if(_isLoadingTokens) return; _isLoadingTokens = true; - var tokens = await Web3.Wallet.GetTokenAccounts(Commitment.Confirmed); + var tokens = await Web3.Wallet.GetTokenAccounts(Commitment.Processed); if(tokens == null) return; // Remove tokens not owned anymore and update amounts var tkToRemove = new List(); @@ -173,7 +173,10 @@ private async UniTask GetOwnedTokenAccounts() tkToRemove.ForEach(tk => { _instantiatedTokens.Remove(tk); - Destroy(tk.gameObject); + MainThreadDispatcher.Instance().Enqueue(() => + { + Destroy(tk.gameObject); + }); }); // Add new tokens List loadingTasks = new List(); @@ -186,22 +189,25 @@ private async UniTask GetOwnedTokenAccounts() if (!(item.Account.Data.Parsed.Info.TokenAmount.AmountUlong > 0)) break; if (_instantiatedTokens.All(t => t.TokenAccount.Account.Data.Parsed.Info.Mint != item.Account.Data.Parsed.Info.Mint)) { - var tk = Instantiate(tokenItem, tokenContainer, true); - tk.transform.localScale = Vector3.one; - - var loadTask = Nft.Nft.TryGetNftData(item.Account.Data.Parsed.Info.Mint, - Web3.Instance.WalletBase.ActiveRpcClient).AsUniTask(); - loadingTasks.Add(loadTask); - loadTask.ContinueWith(nft => + // Run in the main thread + await MainThreadDispatcher.Instance().EnqueueAsync(() => { - TokenItem tkInstance = tk.GetComponent(); - _instantiatedTokens.Add(tkInstance); - tk.SetActive(true); - if (tkInstance) + var tk = Instantiate(tokenItem, tokenContainer, true); + tk.transform.localScale = Vector3.one; + var loadTask = Nft.Nft.TryGetNftData(item.Account.Data.Parsed.Info.Mint, + Web3.Instance.WalletBase.ActiveRpcClient, commitment: Commitment.Processed).AsUniTask(); + loadingTasks.Add(loadTask); + loadTask.ContinueWith(nft => { - tkInstance.InitializeData(item, this, nft).Forget(); - } - }).Forget(); + TokenItem tkInstance = tk.GetComponent(); + _instantiatedTokens.Add(tkInstance); + tk.SetActive(true); + if (tkInstance) + { + tkInstance.InitializeData(item, this, nft).Forget(); + } + }).Forget(); + }); } } } diff --git a/Samples~/Solana Wallet/Textures/magicblock-logo.png.meta b/Samples~/Solana Wallet/Textures/magicblock-logo.png.meta index 608930d6..58c8b0c1 100644 --- a/Samples~/Solana Wallet/Textures/magicblock-logo.png.meta +++ b/Samples~/Solana Wallet/Textures/magicblock-logo.png.meta @@ -125,6 +125,18 @@ TextureImporter: overridden: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: []