From 962c215e3b14d45d74087b796edade0ec46b6a00 Mon Sep 17 00:00:00 2001 From: neuecc Date: Thu, 21 May 2020 02:24:12 +0900 Subject: [PATCH] Fix UniTask.WaitUntilValueChanged does not handle UnityEngine.Object is destroyed correctly --- .../Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs index 6c2a37e..a4c67a2 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs @@ -28,7 +28,7 @@ namespace Cysharp.Threading.Tasks where T : class { var unityObject = target as UnityEngine.Object; - var isUnityObject = !object.ReferenceEquals(target, null); // don't use (unityObject == null) + 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) @@ -330,6 +330,7 @@ namespace Cysharp.Threading.Tasks static readonly PromisePool> pool = new PromisePool>(); T target; + UnityEngine.Object targetAsUnityObject; U currentValue; Func monitorFunction; IEqualityComparer equalityComparer; @@ -351,6 +352,7 @@ namespace Cysharp.Threading.Tasks var result = pool.TryRent() ?? new WaitUntilValueChangedUnityObjectPromise(); result.target = target; + result.targetAsUnityObject = target as UnityEngine.Object; result.monitorFunction = monitorFunction; result.currentValue = monitorFunction(target); result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); @@ -399,7 +401,7 @@ namespace Cysharp.Threading.Tasks public bool MoveNext() { - if (cancellationToken.IsCancellationRequested || target == null) // destroyed = cancel. + if (cancellationToken.IsCancellationRequested || targetAsUnityObject == null) // destroyed = cancel. { core.TrySetCanceled(cancellationToken); return false;