メインコンテンツまでスキップ

PlayerLoopTiming

public enum PlayerLoopTiming : byte

名前空間:UnaPartidaMas.Valkarn.Tasks

ValkarnTasks操作がサスペンド後に再開するために使用するUnity PlayerLoopフェーズを指定します。PlayerLoopTiming値を渡すことで、awaitコンティニュエーションがフレーム内のいつ実行されるか、および遅延や待機条件などの繰り返しアイテムがいつチェックされるかを制御します。

列挙型の値はUniTaskのPlayerLoopTiming列挙型と正確に一致しており、UniTaskからの移行が簡単です。


デフォルト

PlayerLoopTiming.Update(値8)はすべての操作のデフォルトです。タイミング引数を渡さない場合、Updateが使用されます。


Initialization

値: 0
親フェーズ: UnityEngine.PlayerLoop.Initialization
位置: フェーズの最初のサブシステム

そのフェーズ内のUnity独自の初期化サブシステムより前、Initializationフェーズの最初に実行されます。これはEarlyUpdateの前にフレームごとに一度起動します。ゲームプレイコードではほとんど役立ちませんが、フレーム内の他のものが触れる前に状態を読み取りまたは設定する必要があるシステムに関連する場合があります。


LastInitialization

値: 1
親フェーズ: UnityEngine.PlayerLoop.Initialization
位置: フェーズの最後のサブシステム

UnityのビルトインInitializationサブシステムの後、Initializationフェーズの終わりに実行されます。初期化フェーズのタイミングが必要だがUnity独自のシステムを先に実行させたい場合はInitializationよりこちらを優先してください。


EarlyUpdate

値: 2
親フェーズ: UnityEngine.PlayerLoop.EarlyUpdate
位置: フェーズの最初のサブシステム

Unityが入力イベントを処理する前および物理シミュレーションステップの前、EarlyUpdateの開始時に実行されます。これは前フレームの入力データが利用可能なフレーム内の最も早いポイントです。ゲームプレイコードが実行される前に入力をサンプリングする必要があるシステムに有用です。


LastEarlyUpdate

値: 3
親フェーズ: UnityEngine.PlayerLoop.EarlyUpdate
位置: フェーズの最後のサブシステム

UnityのEarlyUpdateサブシステムが完了した後、EarlyUpdateの終わりに実行されます。


FixedUpdate

値: 4
親フェーズ: UnityEngine.PlayerLoop.FixedUpdate
位置: フェーズの最初のサブシステム

各FixedUpdateステップの開始時に実行されます。これはMonoBehaviour.FixedUpdate()のタイミングに対応します。Unityは物理タイムステップとフレームデルタタイムの整合に応じて、レンダリングフレームごとにゼロまたは複数のFixedUpdateステップを実行する場合があります。

物理シミュレーションと同期する必要があるすべてに使用します:Rigidbody速度の読み取り、力の適用、物理で決定されたステップ数の待機。

// 10物理ステップを待機
await ValkarnTask.DelayFrame(10, PlayerLoopTiming.FixedUpdate, ct);

// 物理条件がtrueになるまで待機、各物理ステップでチェック
await ValkarnTask.WaitUntil(() => rb.velocity.magnitude < 0.1f,
PlayerLoopTiming.FixedUpdate, ct);

LastFixedUpdate

値: 5
親フェーズ: UnityEngine.PlayerLoop.FixedUpdate
位置: フェーズの最後のサブシステム

UnityのPhysicsサブシステム(Physics.Simulateを含む)が完了した後、FixedUpdateフェーズの終わりに実行されます。シミュレーションが進んだ後に物理結果を読み取るために使用します。


PreUpdate

値: 6
親フェーズ: UnityEngine.PlayerLoop.PreUpdate
位置: フェーズの最初のサブシステム

FixedUpdateの後でUpdateの前に実行されるPreUpdateフェーズの開始時に実行されます。UnityはPreUpdateをウィンドゾーン更新やネットワークイベント処理などのタスクに使用します。


LastPreUpdate

値: 7
親フェーズ: UnityEngine.PlayerLoop.PreUpdate
位置: フェーズの最後のサブシステム

PreUpdateの終わりに実行されます。


Update

値: 8  (デフォルト)
親フェーズ: UnityEngine.PlayerLoop.Update
位置: フェーズの最初のサブシステム

すべてのValkarnTasks操作のデフォルトタイミングMonoBehaviour.Update()が起動するUpdateフェーズの開始時に実行されます。ゲームプレイコードの圧倒的多数に適した選択です。

// これらはすべてデフォルトでUpdateを使用
await ValkarnTask.Yield();
await ValkarnTask.Delay(1000, ct);
await ValkarnTask.WaitUntil(() => _ready, ct: ct);
await ValkarnTask.NextFrame(ct: ct);
await ValkarnTask.DelayFrame(3, ct: ct);

// 明示的 — 上記と同一
await ValkarnTask.Yield(PlayerLoopTiming.Update);

LastUpdate

値: 9
親フェーズ: UnityEngine.PlayerLoop.Update
位置: フェーズの最後のサブシステム

すべてのMonoBehaviour.Update()呼び出しと他のUpdateサブシステムが完了した後、Updateフェーズの終わりに実行されます。コンティニュエーションが他のスクリプトのUpdate()メソッドの結果を観測しなければならない場合に使用します — 例えば、別のスクリプトがUpdate中に書き込む値をポーリングする場合。

// このフレームのすべてのMonoBehaviour.Update()呼び出し後に再開
await ValkarnTask.Yield(PlayerLoopTiming.LastUpdate);

PreLateUpdate

値: 10
親フェーズ: UnityEngine.PlayerLoop.PreLateUpdate
位置: フェーズの最初のサブシステム

MonoBehaviour.LateUpdate()が起動するPreLateUpdateフェーズの開始時に実行されます。カメラフォロー、トランスフォーム調整、Update中に設定された最終位置に反応すべきすべてに使用します。

// MonoBehaviour.LateUpdate()と同じポイントで再開
await ValkarnTask.Yield(PlayerLoopTiming.PreLateUpdate);

LastPreLateUpdate

値: 11
親フェーズ: UnityEngine.PlayerLoop.PreLateUpdate
位置: フェーズの最後のサブシステム

すべてのMonoBehaviour.LateUpdate()呼び出しの後、PreLateUpdateフェーズの終わりに実行されます。スクリプトがLateUpdate中に設定した値を読む必要がある場合に使用します。


PostLateUpdate

値: 12
親フェーズ: UnityEngine.PlayerLoop.PostLateUpdate
位置: フェーズの最初のサブシステム

PostLateUpdateの開始時に実行されます。このフェーズはフレームのレンダリングがサブミットされた後に起動します。Unityはフレームバッファーのプレゼンテーションやレンダリング状態のクリーンアップなどのタスクに使用します。Camera.onPostRenderコールバックもここで起動します。

フレーム終了時の操作に使用します:スクリーンショットキャプチャ、ストリーミングレベルのアンロード、シーンが完全にレンダリングされた後で次のフレームが始まる前に行う必要がある作業。


LastPostLateUpdate

値: 13
親フェーズ: UnityEngine.PlayerLoop.PostLateUpdate
位置: フェーズの最後のサブシステム

Unityがフレームローカル状態をリセットして次のフレームを開始する前の標準フレームループの最後のポイント。タイミング目的ではフレームの絶対的な終わりです。


TimeUpdate

値: 14
親フェーズ: UnityEngine.PlayerLoop.TimeUpdate
位置: フェーズの最初のサブシステム

TimeUpdateフェーズの開始時に実行されます。UnityはこのフェーズをTime関連の状態(Time.timeなど)の進行に使用します。このタイミングは新しいUnityバージョンではEarlyUpdateの前に起動します。

このタイミングはゲームコードではほとんど必要ありません。主に他のシステムが新しい時間値を読む前に時間の進行を傍受または観測する必要があるシステムのために存在します。


LastTimeUpdate

値: 15
親フェーズ: UnityEngine.PlayerLoop.TimeUpdate
位置: フェーズの最後のサブシステム

UnityのTime関連サブシステムが完了した後、TimeUpdateフェーズの終わりに実行されます。


まとめ表

名前Unityフェーズ位置相当するMonoBehaviourコールバック
0InitializationInitialization最初
1LastInitializationInitialization最後
2EarlyUpdateEarlyUpdate最初
3LastEarlyUpdateEarlyUpdate最後
4FixedUpdateFixedUpdate最初FixedUpdate()
5LastFixedUpdateFixedUpdate最後FixedUpdate()
6PreUpdatePreUpdate最初
7LastPreUpdatePreUpdate最後
8Update(デフォルト)Update最初Update()
9LastUpdateUpdate最後すべてのUpdate()
10PreLateUpdatePreLateUpdate最初LateUpdate()
11LastPreLateUpdatePreLateUpdate最後すべてのLateUpdate()
12PostLateUpdatePostLateUpdate最初レンダリング後
13LastPostLateUpdatePostLateUpdate最後フレーム終了
14TimeUpdateTimeUpdate最初
15LastTimeUpdateTimeUpdate最後

PlayerLoopTimingを受け入れるAPI

時間ベースおよび条件ベースのすべてのValkarnTasks APIはオプションのPlayerLoopTimingパラメーターを受け入れます。デフォルトは常にUpdateです。

メソッドシグネチャ
ValkarnTask.YieldYield(PlayerLoopTiming timing = Update)
ValkarnTask.NextFrameNextFrame(PlayerLoopTiming timing = Update, CancellationToken ct = default)
ValkarnTask.DelayFrameDelayFrame(int frameCount, PlayerLoopTiming timing = Update, CancellationToken ct = default)
ValkarnTask.Delay(int)Delay(int ms, DelayType type = DeltaTime, PlayerLoopTiming timing = Update, CancellationToken ct = default)
ValkarnTask.Delay(TimeSpan)Delay(TimeSpan delay, DelayType type = DeltaTime, PlayerLoopTiming timing = Update, CancellationToken ct = default)
ValkarnTask.WaitUntilWaitUntil(Func<bool> predicate, PlayerLoopTiming timing = Update, CancellationToken ct = default)
ValkarnTask.WaitWhileWaitWhile(Func<bool> predicate, PlayerLoopTiming timing = Update, CancellationToken ct = default)

コード例

using UnaPartidaMas.Valkarn.Tasks;
using System.Threading;

// 次のUpdateティックにyield(デフォルト)
await ValkarnTask.Yield();

// 次のFixedUpdateティックにyield — 物理駆動コード内で使用
await ValkarnTask.Yield(PlayerLoopTiming.FixedUpdate);

// スケール済みdeltaTimeを使用して500ms待機、各Updateでチェック
await ValkarnTask.Delay(500, ct: destroyCancellationToken);

// 非スケールdeltaTimeを使用して500ms待機 — Time.timeScaleの影響を受けない
await ValkarnTask.Delay(
500,
DelayType.UnscaledDeltaTime,
PlayerLoopTiming.Update,
destroyCancellationToken);

// リアル壁時計時間を使用して500ms待機(Stopwatchベース)
await ValkarnTask.Delay(
500,
DelayType.Realtime,
PlayerLoopTiming.Update,
destroyCancellationToken);

// LateUpdateでチェックしてフラグが設定されるまで待機
bool _isReady;
await ValkarnTask.WaitUntil(() => _isReady, PlayerLoopTiming.PreLateUpdate, destroyCancellationToken);

// フレームの最後までロードしながら待機
await ValkarnTask.WaitWhile(() => _loading, PlayerLoopTiming.LastPostLateUpdate, destroyCancellationToken);

// ちょうど5物理ステップをスキップ
await ValkarnTask.DelayFrame(5, PlayerLoopTiming.FixedUpdate, destroyCancellationToken);

// レンダリングされた1フレームを進める
await ValkarnTask.NextFrame(PlayerLoopTiming.Update, destroyCancellationToken);