#代わりはWhile
代わりにWhileを使います。WaitUntilを使うと条件式が最初から真でも1フレーム消費してしまうようです。以下確認コードと結果。Unity2017.2 0p4 Windows版のEditorによるテストです。
WaitUntilTest.cs
using System.Collections;
using UnityEngine;
public class WaitUntilTest : MonoBehaviour
{
[SerializeField]
bool whileContinue = false;
void Start()
{
Log("Start");
StartCoroutine(TestWaitUntil());
StartCoroutine(TestWaitForSeconds());
StartCoroutine(TestWhile());
}
IEnumerator TestWaitUntil()
{
Log("TestWaitUntil");
yield return new WaitUntil(() => true);
Log("TestWaitUntilAfterBlock");
}
IEnumerator TestWaitForSeconds()
{
Log("TestWaitForSeconds");
yield return new WaitForSeconds(0f);
Log("TestWaitForSecondsAfterBlock");
}
IEnumerator TestWhile()
{
Log("TestWhile");
while(whileContinue)
yield return null;
Log("TestWhileAfterBlock");
}
void Log(string message)
{
Debug.Log(Time.time.ToString("n5") + " :" + message);
}
}
結果
0.00000 :Start
0.00000 :TestWaitUntil
0.00000 :TestWaitForSeconds
0.00000 :TestWhile
0.00000 :TestWhileAfterBlock
0.02000 :TestWaitUntilAfterBlock
0.02000 :TestWaitForSecondsAfterBlock
個人的にはWaitUntilが好きです。「ここで他の処理を待っています」というのが明示できるからです。ただパフォーマンスに関わるとなれば仕方ありません。たかが1フレーム、されど1フレーム。見逃すと入力連打によるバグに繋がったりします。
ついでにWaitForSecondsも調べました。同様に1フレーム消費してしまうようです。どうやらYieldInstructionには同じ性質がありそうです。