public IEnumerator Run() { while (true) { var topWorker = _processStack.Peek(); bool isDone; try { isDone = !topWorker.MoveNext(); } catch (Exception e) { //尝试输入异常信息 var objectTrace = GenerateObjectTrace(_processStack); if (objectTrace.Any()) { _awaiter.Complete( default(T), new Exception( GenerateObjectTraceMessage(objectTrace), e)); } else { _awaiter.Complete(default(T), e); } yield break; } if (isDone) { _processStack.Pop(); if (_processStack.Count == 0) { _awaiter.Complete((T)topWorker.Current, null); yield break; } } if (topWorker.Current is IEnumerator) { //如果还是协程,继续运行 _processStack.Push((IEnumerator)topWorker.Current); } else { //返回给Unity做处理 yield return(topWorker.Current); } } }
public static IEnumerator ResourceRequest( UnityAwaiter <UnityEngine.Object> awaiter, ResourceRequest instruction) { yield return(instruction); awaiter.Complete(instruction.asset, null); }
public static IEnumerator ReturnSelf <T>( UnityAwaiter <T> awaiter, T instruction) { yield return(instruction); awaiter.Complete(instruction, null); }
public static IEnumerator AssetBundleCreateRequest( UnityAwaiter <AssetBundle> awaiter, AssetBundleCreateRequest instruction) { yield return(instruction); awaiter.Complete(instruction.assetBundle, null); }
public static IEnumerator ReturnVoid( UnityAwaiter awaiter, object instruction) { // 暂且认定不会抛异常 yield return(instruction); awaiter.Complete(null); }
public static UnityAwaiter GetAwaiter <T>(this WaitForAction <T> waitForAction) { var awaiter = new UnityAwaiter(); if (waitForAction.GetAction() != null) { RunOnUnityScheduler(waitForAction.GetAction(), waitForAction.GetData()); } awaiter.Complete(null); return(awaiter); }
public static IEnumerator FuncGetReturn <T>(UnityAwaiter <T> awaiter, Func <T> func) { yield return(null); awaiter.Complete(func(), null); }