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); } }
/// <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); }