This document is about: QUANTUM 2
SWITCH TO

Input & Connection Flags

概述

Quantum使用DeterministicInputFlags以:

  • 偵測一名玩家是否 存在 ,也就是是否連線到模擬;
  • 決定如何針對給定的玩家來 預測 下一個刷新輸入;及,
  • 知道在一個已驗證幀上的輸入,是由客戶端提供,或是由伺服器 替換

透過執行PlayerConnectedSystem,可以自動進行檢查,如需取得更多資訊,請參照其在玩家頁面上的條目

類型

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