Input
為了在回合制遊戲中最佳化頻寬使用,建議使用Command
。只在請求時發送一個Command
,而在每個刷新發送常規輸入;因此前者比後者使用的頻寬更少。
Quantum高爾夫範例執行兩種類型的Command
輸入,PlayCommand
及SkipCommand
。各個輸入使用泛型架構以攜帶特定遊戲的命令資料,並且序列化它。注意事項: 當建立一個新的Command
時,需要手動執行它含有的資料的序列化。
CommandSystem
接收及驗證玩家發送的命令。
命令
遊玩命令
玩家可以在他們的回合發送一個PlayCommand
,以發送在該回合期間採用的決策/移動的資訊。
PlayCommandData
包裝一個FPVector3
及一個FP
,其各自用於保持球打擊方向及力量。
C#
[Serializable]
public struct PlayCommandData
{
// game-specific command data here
public FP Force;
public FPVector3 Direction;
}
public class PlayCommand : DeterministicCommand
{
public PlayCommandData Data;
public override void Serialize(BitStream stream)
{
// serialize command data here
stream.Serialize(ref Data.Force);
stream.Serialize(ref Data.Direction);
}
}
略過命令
玩家可以略過他們目前的回合,方法是發送SkipCommand
。
C#
[Serializable]
public struct SkipCommandData
{
// game-specific command data here
}
public class SkipCommand : DeterministicCommand
{
public SkipCommandData Data;
public override void Serialize(BitStream stream)
{
// serialize command data here
}
}
Unity側協助工具
在Unity側有一些指令碼可以協助快取及發送輸入。
命令發送器
CommandDispatcher
用於發送所有本機玩家的PlayCommand
及SkipCommand
本機玩家。
打擊輸入
StrikeInput
轉傳活躍中玩家的瞄準輸入,由InputPoller
來註冊及輪詢。
StrikeInput
指令碼接聽由InputManager
發送的活躍中本機玩家的輸入事件。使用滑鼠拖曳以更新瞄準方向。它的另一個責任是持續地更新力量條標記位置。
當玩家正在瞄準並且放開滑鼠按鈕時,發送一個PlayCommand
,其附有目前瞄準方向及力量條標記位置。
AimSensitivity
:拖動滑鼠並更改拍攝方向時使用的比例因數。ReverseControls
:輸入拖動值在應用於拍攝方向之前會被反轉。ClampDirection
:瞄準方向角度根據GameConfig
資產中定義的最小——最大打擊角度值來進行夾緊。這些值由模擬來雙重檢查。它也夾緊最大打擊開放值,而這純粹只是針對視覺效果/UI的目的來進行。MaxStrikeOpeningAngle
:當玩家開始瞄準時,相對於相機的面對方向的最大開放角度。
輸入管理器
它執行各種靜態靜態事件以處理輸入事件,比如滑鼠按鈕事件。其他指令碼如果有興趣接收此類輸入/事件,則會向InputManager
註冊。
輸入輪詢器
Quantum模擬在一個給定的速率下從Unity輪詢輸入——這在Deterministic Config
中定義。針對本機玩家,InputPoller
負責讀取最近的已註冊輸入,這樣模擬可以輪詢它。
輸入資料從註冊時被儲存,直到被同一名玩家的另一個輸入所覆寫,或直到玩家的回合結束。在後者的情形,已註冊輸入被重新設定為其預設值。這個設定允許在遠端玩家瞄準時從模擬來輪詢瞄準資料,也允許在本機玩家瞄準時從InputPoller
中的已註冊輸入來輪詢瞄準資料;這帶來一個更清晰的視覺效果回應。
瞄準UI顯示
AimingDisplay
負責在玩家瞄準時更新視覺效果功能,比如方向箭頭與力量條。
當本機玩家在瞄準時,AimingDisplay
從InputPoller
針對該特定玩家來輪詢已註冊輸入;或者,如果是遠端玩家,則指令碼輪詢來自模擬的最新的相對應輸入。