本日は 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}"); } }
動作確認
サンプルスクリプトを設定したシーンを再生して動作を確認します。
再生モードでコンテンツメニューから関数を実行すると、以下の通りログ出力を指定フレーム待機できました。