入力と接続フラグ
はじめに
Quantumでは、以下の用途でDeterministicInputFlags
が使用されます。
- プレイヤーがシミュレーションに存在する(つまり接続している)かどうかを検知する。
- あるプレイヤーの次のティックの入力をどう予測するかを決定する。
- 確定フレームの入力が、クライアントから与えられたものなのか、サーバーによって置き換えられたものなのかを判定する。
PlayerConnectedSystem
を実行することで、これらを自動化することが可能です。詳細はプレイヤーのページをご覧ください。
種類
C#
public enum DeterministicInputFlags : byte {
Repeatable = 1 << 0,
PlayerNotPresent = 1 << 1,
ReplacedByServer = 1 << 2,
Command = 1 << 3
}
PlayerNotPresent
= このプレイヤーインデックスに接続しているクライアントが存在しないという意味です。ReplacedByServer
= このプレイヤーインデックスはクライアントによって制御されているが、時間までクライアントの入力が送信されなかったため、サーバーが入力を「繰り返し」「0などに置換」たという意味です。Repeatable
= サーバーと他のクライアントへ、この入力データを次のティックへコピーするよう伝えます(タイムアウトによる入力の置換の場合はサーバーへ、ローカルの予測アルゴリズムの場合は他のクライアントへ)。これはUnityからプレイヤー入力を渡す際に設定され、移動のような直接操作の入力に使用します。コマンドのような入力(例:アイテム購入)には使用されません。
実装例
重要: DeterministicInputFlags
は、確定フレームでのみ信頼性があります。
以下のコードスニペットは、SDKで提供されているPlayerConnectedSystem
からの抜粋です。
C#
public unsafe class PlayerConnectedSystem : SystemMainThread {
public override void Update(Frame f) {
// 確定フレームでのみ信頼性がある
if (f.IsVerified == false) {
return;
}
for (int p = 0; p < f.PlayerCount; p++) {
var isPlayerConnected = (f.GetPlayerInputFlags(p) & Photon.Deterministic.DeterministicInputFlags.PlayerNotPresent) == 0;
// プレイヤーの接続状態に基づく追加ロジック
}
}
}
Back to top