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