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