問題
フレーム内のなるべく遅いタイミングで、何か処理をしたい。普通なら、 LateUpdate()
で十分だが、諸々の事情により OnGUI()
よりも遅いタイミングが必要になった。
そこで実行順に関する公式ドキュメント(Order of Execution for Event Functions)を確認したところ良さげなタイミングを見つけたので、 WaitForEndOfFrame()
を利用して強引に作ってみた。
endofframetest.cs
public class endofframetest : MonoBehaviour
{
void Start()
{
StartCoroutine(StartEndOfFrame());
Debug.Log($"Start():{Time.frameCount}");
}
IEnumerator StartEndOfFrame()
{
while (true)
{
// Wait until all rendering + UI is done.
yield return new WaitForEndOfFrame();
OnEndOfFrame();
}
}
private void FixedUpdate()
{
Debug.Log($"FixedUpdate():{Time.frameCount}");
}
void Update()
{
Debug.Log($"Update():{Time.frameCount}");
}
private void LateUpdate()
{
Debug.Log($"LateUpdate():{Time.frameCount}");
}
private void OnGUI()
{
Debug.Log($"OnGUI():{Time.frameCount}");
}
private void OnEndOfFrame()
{
Debug.Log($"OnEndOfFrame():{Time.frameCount}");
}
}
Console.
Start():1
FixedUpdate():1
Update():1
LateUpdate():1
FixedUpdate():2
Update():2
LateUpdate():2
OnGUI():2
OnGUI():2
OnEndOfFrame():2
結果
Start()のタイミングを1フレーム目としたとして2フレーム目からしか呼ばれないので、その点は注意する必要があるが概ね問題なく利用できた。
ちなみに、、、OnGUI()も2フレーム目からしか呼ばれないようだ(確認したのはUnity2020.1α)。