0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity】LateUpdate()やOnGUI()よりもタイミングが遅い、OnEndOfFrame()を作ってみた

Last updated at Posted at 2019-12-23

問題

フレーム内のなるべく遅いタイミングで、何か処理をしたい。普通なら、 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α)。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?