入力と接続フラグ
はじめに
DeterministicInputFlags
は、Quantum によって以下の目的で使用されます:
- プレイヤーがシミュレーションに 存在する (すなわち接続されている)かどうかを検出する。
- 特定のプレイヤーの次のティックの入力を 予測 する方法を決定する。
- 確認されたフレームの入力がクライアントによって提供されたものか、それともサーバーによって 置き換えられた ものであるかを知る。
PlayerConnectedSystem
を実装することで、これらのチェックを自動化することが可能です。詳細については、プレイヤーページのエントリを参照してください。
タイプ
C#
public enum DeterministicInputFlags : byte {
Repeatable = 1 << 0,
PlayerNotPresent = 1 << 1,
ReplacedByServer = 1 << 2,
Command = 1 << 3
}
PlayerNotPresent
= このプレイヤーインデックスに対してクライアントが接続されていないことを意味します。ReplacedByServer
= プレイヤーインデックスがクライアントによって制御されているが、クライアントがタイムリーに入力を送信しなかったため、サーバーが入力を繰り返す、または置き換え/ゼロにしたことを意味します。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