public static IEnumerator <CommandDelegate> CoroutineOne(Ref <float> val, int depth, Ref <int> calledCount) { if (depth > 0) { ++calledCount.Value; yield return(Cmd.ChangeTo(val, 5.0f, 4.0f)); yield return(Cmd.WaitForSeconds(1.0f)); yield return(Cmd.ChangeBy(val, -4.0f, 4.0f)); yield return(null); // Wait for a single frame yield return(Cmd.Coroutine(() => CoroutineOne(val, depth - 1, calledCount))); } }
public static void TestCoroutine() { float floatVal = 0.0f; Ref <float> floatRef = new Ref <float>( () => floatVal, t => floatVal = t ); int calledCount = 0; Ref <int> calledCountRef = new Ref <int>( () => calledCount, t => calledCount = t ); CommandQueue queue = new CommandQueue(); queue.Enqueue( Cmd.Repeat(2, Cmd.Coroutine(() => CoroutineOne(floatRef, 2, calledCountRef)) ) ); Assert.AreEqual(calledCount, 0); queue.Update(2.0f); Assert.AreEqual(calledCount, 1); Assert.AreEqual(floatVal, 2.5f, 0.001f); queue.Update(5.0f); Assert.AreEqual(calledCount, 1); Assert.AreEqual(floatVal, 3.0f, 0.001f); queue.Update(2.0f); Assert.AreEqual(calledCount, 1); queue.Update(0.0f); // yield return null; Assert.AreEqual(calledCount, 2); queue.Update(4.0f); Assert.AreEqual(calledCount, 2); Assert.AreEqual(floatVal, 5.0f, 0.001f); queue.Update(5.0f); Assert.AreEqual(calledCount, 2); queue.Update(0.0f); // yield return null; Assert.AreEqual(calledCount, 3); queue.Update(4.0f); Assert.AreEqual(calledCount, 3); Assert.AreEqual(floatVal, 5.0f, 0.001f); }