入力&接続フラグ
イントロダクション
QuantumでのDeterministicInputFlags
は以下の目的で使用します。
- プレイヤーが 存在している かの検証。例:シミュレーションのため接続済み;
- 既定のプレイヤーに対し、次のティックの入力 予測 方法の判断;
- 認証フレームでの入力がクライアントから提供されたか、サーバーによって 置き換えられた か、判別
PlayerConnectedSystem
を実装することで、チェックを自動化することができます。詳しくはPlayerページのエントリを参照してください。
タイプ
C#
public enum DeterministicInputFlags : byte {
Repeatable = 1 << 0,
PlayerNotPresent = 1 << 1,
ReplacedByServer = 1 << 2
}
PlayerNotPresent
= このプレイヤーインデックスで、接続済みのクライアントはいない。ReplacedByServer
= プレイヤーインデックスはクライアントによって管理されているが、クライアントが時間内に入力を送信しなかったため、サーバーで入力が繰り返されたり、置き換えられたり、なかったことにされたりしている。Repeatable
= サーバーとその他のクライアントに対し、この入力データを次のティック(タイムアウトで入力が置き換えられている場合はサーバー、ローカル予測アルゴリズムの場合はその他のクライアント)に複製するように伝える。これは、Unityの開発者がプレイヤー入力を挿入するときに設定することができ、移動などのダイレクトコントロール系直接制御系入力で使用する。コマンド系入力のためのものではない(例:アイテム購入)。
実装例
重要: DeterministicInputFlags
が信用できるのは 認証済み フレーム上でのみです。
以下のコードスニペットはBotSDKページにあるLittleGuysサンプルのものです。
C#
private void UpdateIsBot(Frame f, EntityRef littleGuyEntity)
{
// Return if players shouldn't be replaced by bots
if (!f.RuntimeConfig.ReplaceOnDisconnect)
return;
// Only update this information if this frame is Verified.
if (!f.IsVerified) return;
var littleGuyComponent = f.Unsafe.GetPointer<LittleGuyComponent>(littleGuyEntity);
// Get the input flags for that player
var inputFlags = f.GetPlayerInputFlags(littleGuyComponent->PlayerRef);
// Bitwise operations to see if the PlayerNotPresent flag is activated
var playerDisconnected = (inputFlags & DeterministicInputFlags.PlayerNotPresent) == DeterministicInputFlags.PlayerNotPresent;
// Store it in the IsBot field so this can be evaluated in other parts of code
littleGuyComponent->IsBot = playerDisconnected;
// Only initialize the entity as a bot if it doesn't have the HFSM Agent component yet
if (playerDisconnected && f.TryGet<HFSMAgent>(littleGuyEntity, out var hfsmAgent) == false)
{
// We're replacing players only by the HFSM, but this could easily be changed to be GOAP instead
HFSMHelper.SetupHFSM(f, littleGuyEntity, f.RuntimeConfig.ReplacementHFSM);
}
}
Back to top