This commit is contained in:
neuecc
2019-05-30 19:41:23 +09:00
parent fbe6746850
commit 642cbe6bcd
31 changed files with 765 additions and 66 deletions

View File

@@ -4,7 +4,7 @@
namespace System.Runtime.CompilerServices
{
public sealed class AsyncMethodBuilderAttribute : Attribute
internal sealed class AsyncMethodBuilderAttribute : Attribute
{
public Type BuilderType { get; }

View File

@@ -3,9 +3,11 @@
using System;
using System.Collections;
using System.Reflection;
using System.Runtime.ExceptionServices;
using System.Threading;
using UniRx.Async.Internal;
using UnityEngine;
namespace UniRx.Async
{
@@ -57,7 +59,7 @@ namespace UniRx.Async
return;
}
this.innerEnumerator = innerEnumerator;
this.innerEnumerator = ConsumeEnumerator(innerEnumerator);
this.status = AwaiterStatus.Pending;
this.cancellationToken = cancellationToken;
this.continuation = null;
@@ -142,6 +144,108 @@ namespace UniRx.Async
Error.ThrowWhenContinuationIsAlreadyRegistered(this.continuation);
this.continuation = continuation;
}
// Unwrap YieldInstructions
static IEnumerator ConsumeEnumerator(IEnumerator enumerator)
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
if (current == null)
{
yield return null;
}
else if (current is CustomYieldInstruction)
{
// WWW, WaitForSecondsRealtime
var e2 = UnwrapWaitCustomYieldInstruction((CustomYieldInstruction)current);
while (e2.MoveNext())
{
yield return null;
}
}
else if (current is YieldInstruction)
{
IEnumerator innerCoroutine = null;
switch (current)
{
case AsyncOperation ao:
innerCoroutine = UnwrapWaitAsyncOperation(ao);
break;
case WaitForSeconds wfs:
innerCoroutine = UnwrapWaitForSeconds(wfs);
break;
}
if (innerCoroutine != null)
{
while (innerCoroutine.MoveNext())
{
yield return null;
}
}
else
{
yield return null;
}
}
else if (current is IEnumerator e3)
{
while (e3.MoveNext())
{
yield return null;
}
}
else
{
// WaitForEndOfFrame, WaitForFixedUpdate, others.
yield return null;
}
}
}
// WWW and others as CustomYieldInstruction.
static IEnumerator UnwrapWaitCustomYieldInstruction(CustomYieldInstruction yieldInstruction)
{
while (yieldInstruction.keepWaiting)
{
yield return null;
}
}
static readonly FieldInfo waitForSeconds_Seconds = typeof(WaitForSeconds).GetField("m_Seconds", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic);
static IEnumerator UnwrapWaitForSeconds(WaitForSeconds waitForSeconds)
{
var second = (float)waitForSeconds_Seconds.GetValue(waitForSeconds);
var startTime = DateTimeOffset.UtcNow;
while (true)
{
yield return null;
var elapsed = (DateTimeOffset.UtcNow - startTime).TotalSeconds;
if (elapsed >= second)
{
break;
}
};
}
static IEnumerator UnwrapEnumerator(IEnumerator enumerator)
{
while (enumerator.MoveNext())
{
yield return null;
}
}
static IEnumerator UnwrapWaitAsyncOperation(AsyncOperation asyncOperation)
{
while (!asyncOperation.isDone)
{
yield return null;
}
}
}
}
}

View File

@@ -29,7 +29,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnAnimatorIKAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<int> OnAnimatorIKAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onAnimatorIK, ref onAnimatorIKs, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnBeginDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnBeginDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onBeginDrag, ref onBeginDrags, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCancelAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnCancelAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCancel, ref onCancels, cancellationToken);
}

View File

@@ -32,7 +32,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCollisionEnter2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collision2D> OnCollisionEnter2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCollisionEnter2D, ref onCollisionEnter2Ds, cancellationToken);
}
@@ -44,7 +44,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCollisionExit2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collision2D> OnCollisionExit2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCollisionExit2D, ref onCollisionExit2Ds, cancellationToken);
}
@@ -56,7 +56,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCollisionStay2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collision2D> OnCollisionStay2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCollisionStay2D, ref onCollisionStay2Ds, cancellationToken);
}

View File

@@ -32,7 +32,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCollisionEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collision> OnCollisionEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCollisionEnter, ref onCollisionEnters, cancellationToken);
}
@@ -44,7 +44,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCollisionExitAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collision> OnCollisionExitAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCollisionExit, ref onCollisionExits, cancellationToken);
}
@@ -56,7 +56,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCollisionStayAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collision> OnCollisionStayAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCollisionStay, ref onCollisionStays, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnDeselectAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnDeselectAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onDeselect, ref onDeselects, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onDrag, ref onDrags, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnDropAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnDropAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onDrop, ref onDrops, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnEndDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnEndDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onEndDrag, ref onEndDrags, cancellationToken);
}

View File

@@ -59,7 +59,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnDeselectAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnDeselectAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onDeselect, ref onDeselects, cancellationToken);
}
@@ -71,7 +71,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnMoveAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<AxisEventData> OnMoveAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onMove, ref onMoves, cancellationToken);
}
@@ -83,7 +83,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerDownAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerDownAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerDown, ref onPointerDowns, cancellationToken);
}
@@ -95,7 +95,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerEnter, ref onPointerEnters, cancellationToken);
}
@@ -107,7 +107,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerExitAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerExitAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerExit, ref onPointerExits, cancellationToken);
}
@@ -119,7 +119,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerUpAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerUpAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerUp, ref onPointerUps, cancellationToken);
}
@@ -131,7 +131,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnSelectAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnSelectAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onSelect, ref onSelects, cancellationToken);
}
@@ -143,7 +143,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerClickAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerClickAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerClick, ref onPointerClicks, cancellationToken);
}
@@ -155,7 +155,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnSubmitAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnSubmitAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onSubmit, ref onSubmits, cancellationToken);
}
@@ -167,7 +167,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onDrag, ref onDrags, cancellationToken);
}
@@ -179,7 +179,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnBeginDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnBeginDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onBeginDrag, ref onBeginDrags, cancellationToken);
}
@@ -191,7 +191,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnEndDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnEndDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onEndDrag, ref onEndDrags, cancellationToken);
}
@@ -203,7 +203,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnDropAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnDropAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onDrop, ref onDrops, cancellationToken);
}
@@ -215,7 +215,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnUpdateSelectedAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnUpdateSelectedAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onUpdateSelected, ref onUpdateSelecteds, cancellationToken);
}
@@ -227,7 +227,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnInitializePotentialDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnInitializePotentialDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onInitializePotentialDrag, ref onInitializePotentialDrags, cancellationToken);
}
@@ -239,7 +239,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnCancelAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnCancelAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onCancel, ref onCancels, cancellationToken);
}
@@ -251,7 +251,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnScrollAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnScrollAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onScroll, ref onScrolls, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnInitializePotentialDragAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnInitializePotentialDragAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onInitializePotentialDrag, ref onInitializePotentialDrags, cancellationToken);
}

View File

@@ -30,7 +30,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnJointBreakAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<float> OnJointBreakAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onJointBreak, ref onJointBreaks, cancellationToken);
}
@@ -42,7 +42,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnJointBreak2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Joint2D> OnJointBreak2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onJointBreak2D, ref onJointBreak2Ds, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnMoveAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<AxisEventData> OnMoveAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onMove, ref onMoves, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnParticleCollisionAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<GameObject> OnParticleCollisionAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onParticleCollision, ref onParticleCollisions, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerClickAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerClickAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerClick, ref onPointerClicks, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerDownAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerDownAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerDown, ref onPointerDowns, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerEnter, ref onPointerEnters, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerExitAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerExitAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerExit, ref onPointerExits, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnPointerUpAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnPointerUpAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onPointerUp, ref onPointerUps, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnScrollAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<PointerEventData> OnScrollAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onScroll, ref onScrolls, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnSelectAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnSelectAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onSelect, ref onSelects, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnSubmitAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnSubmitAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onSubmit, ref onSubmits, cancellationToken);
}

View File

@@ -32,7 +32,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnTriggerEnter2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collider2D> OnTriggerEnter2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onTriggerEnter2D, ref onTriggerEnter2Ds, cancellationToken);
}
@@ -44,7 +44,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnTriggerExit2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collider2D> OnTriggerExit2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onTriggerExit2D, ref onTriggerExit2Ds, cancellationToken);
}
@@ -56,7 +56,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnTriggerStay2DAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collider2D> OnTriggerStay2DAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onTriggerStay2D, ref onTriggerStay2Ds, cancellationToken);
}

View File

@@ -32,7 +32,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnTriggerEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collider> OnTriggerEnterAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onTriggerEnter, ref onTriggerEnters, cancellationToken);
}
@@ -44,7 +44,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnTriggerExitAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collider> OnTriggerExitAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onTriggerExit, ref onTriggerExits, cancellationToken);
}
@@ -56,7 +56,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnTriggerStayAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<Collider> OnTriggerStayAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onTriggerStay, ref onTriggerStays, cancellationToken);
}

View File

@@ -28,7 +28,7 @@ namespace UniRx.Async.Triggers
}
public UniTask OnUpdateSelectedAsync(CancellationToken cancellationToken = default(CancellationToken))
public UniTask<BaseEventData> OnUpdateSelectedAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return GetOrAddPromise(ref onUpdateSelected, ref onUpdateSelecteds, cancellationToken);
}

View File

@@ -168,13 +168,16 @@ namespace UniRx.Async
}
}
asyncOperation = null; // remove reference.
if (continuationAction != null)
{
asyncOperation.completed -= continuationAction;
asyncOperation = null; // remove reference.
continuationAction = null;
}
else
{
asyncOperation = null; // remove reference.
}
}
public void OnCompleted(Action continuation)
@@ -316,13 +319,17 @@ namespace UniRx.Async
}
this.result = asyncOperation.asset;
asyncOperation = null; // remove reference.
if (continuationAction != null)
{
asyncOperation.completed -= continuationAction;
asyncOperation = null; // remove reference.
continuationAction = null;
}
else
{
asyncOperation = null; // remove reference.
}
return this.result;
}
@@ -576,13 +583,18 @@ namespace UniRx.Async
}
this.result = asyncOperation.webRequest;
asyncOperation = null; // remove reference.
if (continuationAction != null)
{
asyncOperation.completed -= continuationAction;
asyncOperation = null; // remove reference.
continuationAction = null;
}
else
{
asyncOperation = null; // remove reference.
}
return this.result;
}