This document is about: QUANTUM 2
SWITCH TO

入力&接続フラグ

イントロダクション

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