示例#1
0
文件: Timing.cs 项目: zynigma/ddgame
        private static IEnumerator <float> _StartWhenDone(WaitingProcess processData)
        {
            processData.Instance._waitingProcesses.Add(processData);

            yield return(processData.Trigger.Current);

            while (processData.Trigger.MoveNext())
            {
                yield return(processData.Trigger.Current);
            }

            processData.Instance._waitingProcesses.Remove(processData);

            for (int i = 0; i < processData.Tasks.Count; i++)
            {
                processData.Instance.RunCoroutineOnInstance(processData.Tasks[i], processData.Timing);
            }
        }
示例#2
0
文件: Timing.cs 项目: zynigma/ddgame
        /// <summary>
        /// Use the command "yield return Timing.WaitUntilDone(otherCoroutine);" to pause the current
        /// coroutine until the otherCoroutine is done.
        /// </summary>
        /// <param name="otherCoroutine">The coroutine to pause for.</param>
        /// <param name="warnIfNotFound">Post a warning to the console if no hold action was actually performed.</param>
        /// <param name="instance">The instance that the otherCoroutine is attached to. Leave this as null
        /// unless you are using multiple instances of the Timing object.</param>
        public static float WaitUntilDone(IEnumerator <float> otherCoroutine, bool warnIfNotFound = true, Timing instance = null)
        {
            if (instance == null)
            {
                instance = Instance;
            }

            for (int i = 0; i < instance._waitingProcesses.Count; i++)
            {
                if (instance._waitingProcesses[i].Trigger == otherCoroutine)
                {
                    WaitingProcess proc = instance._waitingProcesses[i];
                    ReplacementFunction = (input, timing) =>
                    {
                        proc.Tasks.Add(input);
                        return(null);
                    };

                    return(float.NaN);
                }

                for (int j = 0; j < instance._waitingProcesses[i].Tasks.Count; j++)
                {
                    if (instance._waitingProcesses[i].Tasks[j] == otherCoroutine)
                    {
                        WaitingProcess proc = new WaitingProcess();
                        proc.Instance = instance;
                        proc.Timing   = instance._waitingProcesses[i].Timing;
                        proc.Trigger  = otherCoroutine;
                        proc.Process  = _StartWhenDone(proc);

                        instance._waitingProcesses[i].Tasks[j] = proc.Process;

                        proc.Process.MoveNext();

                        ReplacementFunction = (input, timing) =>
                        {
                            proc.Timing = timing;
                            proc.Tasks.Add(input);

                            return(null);
                        };

                        return(float.NaN);
                    }
                }
            }

            Segment otherCoroutineSegment;

            if (instance.KillCoroutineOnInstance(otherCoroutine, out otherCoroutineSegment))
            {
                ReplacementFunction = (input, timing) =>
                {
                    WaitingProcess proc = new WaitingProcess();
                    proc.Instance = instance;
                    proc.Timing   = timing;
                    proc.Trigger  = otherCoroutine;
                    proc.Process  = _StartWhenDone(proc);
                    proc.Tasks.Add(input);

                    if (timing != otherCoroutineSegment)
                    {
                        instance.RunCoroutineOnInstance(proc.Process, otherCoroutineSegment);
                        return(null);
                    }

                    return(proc.Process);
                };

                return(float.NaN);
            }

            if (warnIfNotFound)
            {
                Debug.LogWarning("HoldUntilDone cannot hold: The coroutine instance that was passed in was not found.");
            }

            return(0f);
        }