Ejemplo n.º 1
0
            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);
                    }
                }
            }
Ejemplo n.º 2
0
            public static IEnumerator ResourceRequest(
                UnityAwaiter <UnityEngine.Object> awaiter, ResourceRequest instruction)
            {
                yield return(instruction);

                awaiter.Complete(instruction.asset, null);
            }
Ejemplo n.º 3
0
            public static IEnumerator ReturnSelf <T>(
                UnityAwaiter <T> awaiter, T instruction)
            {
                yield return(instruction);

                awaiter.Complete(instruction, null);
            }
Ejemplo n.º 4
0
            public static IEnumerator AssetBundleCreateRequest(
                UnityAwaiter <AssetBundle> awaiter, AssetBundleCreateRequest instruction)
            {
                yield return(instruction);

                awaiter.Complete(instruction.assetBundle, null);
            }
Ejemplo n.º 5
0
            public static IEnumerator ReturnVoid(
                UnityAwaiter awaiter, object instruction)
            {
                // 暂且认定不会抛异常
                yield return(instruction);

                awaiter.Complete(null);
            }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
            public static IEnumerator FuncGetReturn <T>(UnityAwaiter <T> awaiter, Func <T> func)
            {
                yield return(null);

                awaiter.Complete(func(), null);
            }