MRが楽しい

MRやVRについて学習したことを書き残す

UniTaskのDelayFrameやYieldを使ってUnityで指定フレーム待機する

本日は UniTask の小ネタ枠です。
UniTaskを使ってUnityで指定フレーム待つ方法についてです。

UniTask

UniTaskの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

指定フレーム待機する

UniTask.Delay を利用すると指定のタイミングでフレームを待機することができます。
また UniTask が戻り値の関数であれば UniTask.Yield を使ってフレーム待機させることもできます。

以下のサンプルスクリプトを作成しました。
・FrameWaitTest.cs

using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;

public class FrameWaitTest : MonoBehaviour
{
    [ContextMenu("WaitFrame")]
    public async UniTask WaitFrame()
    {
        // 再生モード時のみ実行する
        if (!Application.isPlaying) return;
        
        // 実行時のフレーム番号を取得する
        var startFrame = Time.frameCount;
        
        // 実行時からの経過フレームを表示する
        Debug.Log($"現在の経過フレーム:{Time.frameCount - startFrame}");

        // 1フレームだけ待機する
        await UniTask.Yield(PlayerLoopTiming.Update, new CancellationToken());

        // 実行時からの経過フレームを表示する
        Debug.Log($"現在の経過フレーム:{Time.frameCount - startFrame}");

        // 指定したフレーム数だけ待機する
        var waitFrame = 10;
        await UniTask.DelayFrame(waitFrame, PlayerLoopTiming.Update, new CancellationToken());
        
        // 実行時からの経過フレームを表示する
        Debug.Log($"現在の経過フレーム:{Time.frameCount - startFrame}");
    }
}


動作確認

サンプルスクリプトを設定したシーンを再生して動作を確認します。
再生モードでコンテンツメニューから関数を実行すると、以下の通りログ出力を指定フレーム待機できました。