Architecture
這個章節說明了KCC與其他元件的關係及通信流。
碰撞器
- 在運行階段建立KCC碰撞器為一個下層遊戲物件。
- 碰撞器遊戲物件的圖層由
KCCSettings.ColliderLayer
控制,並且透過網路同步。
剛體
Rigidbody
元件由KCC
所需要,並且用於立即位置同步到物理引擎。- 必須啟用
Is Kinematic
旗標(在生成時強制)。
轉換
- 使用轉換元件為只能寫入。
- 在生成期間只讀取一次位置及旋轉。
以下圖表從高層次角度展示了KCC的工作方式:
遊戲遊玩指令碼
- 命令KCC的使用者指令碼,其代表「該做什麼」(以給定方向移動、看著位置、忽略一個特定的碰撞器、做一個跳躍、啟用蹲下等等)。
- 從 資料層 讀取資訊(舉例而言
Is Grounded
、Real Velocity
等等)。 - 調用 公共API(
KCC.SetInputDirection()
、KCC.SetLookRotation()
、KCC.Jump()
)。 - 可以與 互動指令碼 協調運作。
- 舉例而言,
Player
類別轉譯輸入(滑鼠差量)到KCC動作(KCC.SetLookRotation()
)。
互動指令碼
- 使用者指令碼(執行
IKCCProcessor
),其代表「如何移動」(在地面時投射輸入方向,在蹲下時速度減慢50%,計算所需速度)。 - 在 核心迴圈 執行期間間接地插入邏輯。
- 直接寫入到 資料層 或調用 公共API。
- 可以與 遊戲遊玩指令碼 協調運作。
- 可以執行自訂邏輯,比如任何其他的
NetworkBehaviour
。 - 舉例而言,
DashProcessor
類別在啟用時強制覆寫KCC移動速度5秒。
公共API
- 提供一系列命令,其在內部被立即執行或轉換以與KCC執行流、其功能及目前狀態相容(執行另一系列命令,其寫入到 資料層、安全檢查)。
- 將複雜性從使用者抽離。
- 舉例而言,
KCC.SetRadius()
在KCCSettings
中設定Radius
屬性,並且立即散佈值到碰撞器。
核心迴圈
- 處理基礎功能性,如物理查詢、碰撞篩選、取消穿透、網路、追蹤碰撞器、腳步偵測、地面貼齊、網路等等
- 從/往 資料層 讀取寫入。
- 執行舞台以透過相依性插入來控制移動(互動指令碼)。
以下圖表在一個特定案例中展示了上述的一個簡化的應用:
Player
代表 遊戲遊玩指令碼。Environment Processor
及Teleport Processor
代表 互動指令碼。執行遵循這個順序:
- 在
Player
上調用FixedUpdateNetwork()
Player
指令碼基於來自鍵盤或搖桿的輸入,以自訂向量來調用KCC.SetInputDirection()
KCC
寫入所需的輸入方向到KCCData.InputDirection
(資料層)之中- 在
KCC
上調用FixedUpdateNetwork()
KCC
執行一系列的命令,直到針對移動的資料應由 互動指令碼(KCC處理器)來計算KCC
在所有支援這個舞台的處理器上執行PrepareData
舞台(在這個案例中是Environment Processor
)Environment Processor
在內部執行其他舞台集,其結合輸入方向及其他屬性,並且計算KCCData.DynamicVelocity
及KCCData.KinematicVelocity
作為一個結果- 在這個點執行所有舞台,
KCC
繼續處理實際移動邏輯 KCC
結合所有已計算速度及外部差量到位置差量候選KCC
以先前步驟中計算的差量來移動其碰撞器,取消穿透重疊碰撞器,並且重新整理碰撞器的內部清單KCC
在新的已進入/已離開的碰撞器上叫用OnEnter()
/OnExit()
回調(在這個案例中是Teleport Processor
=>OnEnter()
)Teleport Processor
以目標位置來調用KCC.SetPosition()
KCC.SetPosition()
立即傳送KCC
到一個給定位置,並且設定KCCData.HasTeleported
旗標以停止進一步的執行(我們不希望在傳送後繼續移動)KCC
在執行所有回調後恢復核心迴圈KCC
針對早期退出來檢查KCCData.HasTeleported
旗標(在這個案例中它被設定為真)KCC
完成目前更新的執行(略過剩餘位置差量)
如同您可能已經猜到,可以透過使用許多不同的處理器來設計移動,各個處理器貢獻/插入其自己的邏輯。在互動章節可以找到更多資訊。
Back to top