This document is about: FUSION 2
SWITCH TO

Data Layer

KCC設定

KCC將某些屬性公開給元件檢查器,作為一個預設設置。在運行階段可以進一步設置值。

KCC settings
KCC設定

已連網設定

預設透過網路來同步這些設定,在伺服器上的更改將被自動散佈到所有客戶端。在下一個重新模擬刷新之前將回復在客戶端上的本機覆寫。

  • Shape - 定義KCC物理行為。
    • None - 略過內部物理查詢,取消生成碰撞器。仍然可以執行其他邏輯。
    • Capsule - 完整的物理處理,具現化膠囊碰撞器為下層遊戲物件。
  • Is Trigger - KCC碰撞器被標記為觸發。
  • Radius - 碰撞器的半徑。
  • Height - 碰撞器的高度。
  • Extent - 定義周圍的碰撞器偵測的額外的半徑範圍。低的值會降低穩定性,並且在執行額外檢查時會產生潛在效能影響。高的值增加穩定性,但是成本是增加的持續效能影響。建議的範圍是 半徑 的10-20%。
  • Collider Layer - 碰撞器遊戲物件的圖層。
  • Collision Layer Mask - KCC碰撞到的圖層遮罩。
  • Features - KCC功能的預設設置(可以覆寫運行階段值)。可以在功能章節中找到更多資訊。
    • CCD - 啟用持續性碰撞偵測以防止穿過幾何圖案。
    • Anti Jitter - 啟用移動距離容差(位置差量時間應用到轉換)。
    • Prediction Correction - 在不正確的預測時啟用平順校正(在固定的及轉譯更新中解決不正確的預測)。
  • Allow Client Teleports - 允許執行客戶端發起的傳送RPC。
  • Input Authority Behavior - 針對附有輸入授權的KCC來定義更新行為。為了預防物件同時有輸入及狀態授權的情形,這個的優先性高於 狀態授權行為
    • Predict Fixed | Interpolate Render - 在固定更新中的完整的處理/預測,在轉譯更新中在前兩個已預測固定更新狀態之間進行內插補點(預設)。
    • Predict Fixed | Predict Render - 在固定更新中的完整的處理/預測,在轉譯更新中的完整的處理/預測。
  • State Authority Behavior - 針對附有狀態授權的KCC來定義更新行為。
    • Predict Fixed | Interpolate Render - 在固定更新中的完整的處理/預測,在轉譯更新中在前兩個已預測固定更新狀態之間進行內插補點(預設)。
    • Predict Fixed | Predict Render - 在固定更新中的完整的處理/預測,在轉譯更新中的完整的處理/預測。
  • Proxy Behavior - 針對KCC代理來定義更新行為。
    • Skip Fixed | Interpolate Render - 在固定更新中略過處理,在轉譯更新中在伺服器狀態快照之間進行內插補點(預設)。
    • Interpolate Fixed | Interpolate Render - 在固定更新中在伺服器狀態快照之間進行內插補點,在轉譯更新中在伺服器狀態快照之間進行內插補點。
    • Predict Fixed | Interpolate Render - 在固定更新中的完整的處理/預測,在轉譯更新中在前兩個已預測固定更新狀態之間進行內插補點。
    • Predict Fixed | Predict Render - 在固定更新中的完整的處理/預測,在轉譯更新中的完整的處理/預測。

本機設定

不透過網路來同步這些設定,在伺服器或客戶端上的更改將總是在本機。

  • Processors - 在初始化時散佈到 KCC.本機處理器 的預設處理器的清單。任何IKCCProcessor可以在這裡被鏈接。在互動章節可以找到更多關於處理器的資訊。
  • Teleport Threshold - 定義KCC在單一刷新中必須移動的,以被視為即時(傳送)最小距離。這也影響了內插補點。
  • Max Penetration Steps - 單一移動/CCD步被分為多個較小的子步,其帶來更高的總體取消穿透品質。
  • CCD Radius Multiplier - 控制KCC在單一CCD步中移動的最大距離。有效範圍是半徑的25% - 75%。如果角色穿透幾何圖形的話,請使用較低的值。這個設定只有在啟用EKCCFeature.CCD時是有效的。CCD最大步距離 = 半徑 * CCD 半徑乘數
  • Anti Jitter Distance - 定義轉譯位置距離容差,以平順化從幾何圖形取消穿透而導致的抖動。更高的值更多地減少抖動,但在切換移動方向時可能會帶來顯著的延遲。
    • X = 水平軸。
    • Y = 垂直軸。
  • Prediction Correction Speed - 預測錯誤內插補點到零的速度。在功能章節中可以找到更多關於預測校正的資訊。
  • Networked Interactions - 透過網路同步的最大互動(碰撞、調整器、已忽略碰撞器)。可以在互動章節中找到更多關於互動的資訊。
  • Force Single Overlap Query - 在移動期間執行單一重疊查詢。在取消穿透之前在位置上追蹤命中。這是針對非玩家角色的效能最佳化,成本是在移動中可能產生錯誤。
  • Suppress Convex Mesh Colliders - 啟用以總是檢查在非凸網格碰撞器上的碰撞,以防止幽靈碰撞及不正確穿透向量。可以在已知問題章節中找到更多資訊。

從程式碼修正設定

透過屬性KCC.Settings可以從指令碼存取設定。從另一個指令碼來初始化它們的最安全的方式是以KCC.InvokeOnSpawn()來登錄一個回調。

C#

public class Player : NetworkBehaviour
{
    protected override void OnSpawned()
    {
        // We don't know if the KCC is already spawned at this point.
        // KCC.InvokeOnSpawn() ensures the callback is executed after KCC.Spawned() and its API called in proper order.
        // If the KCC is already spawned the callback is executed immediately.
        GetComponent<KCC>().InvokeOnSpawn(InitializeKCC);
    }

    private void InitializeKCC(KCC kcc)
    {
        // The KCC.Spawned() has been already called and we can safely use its API.
        kcc.Settings.CCDRadiusMultiplier = 0.5f;

        // We want to update KCC manually to preserve correct execution order.
        kcc.SetManualUpdate(true);
    }
}

⚠️ 在Spawned()中KCC自動地備份設定,並且在Despawned()中儲存 - 讓其與物件輪詢相容。

在喚醒()中做成的更改與物件輪詢結合後可能是危險的,因為在取消生成()中的設定不會重新設定為在檢查器中設置的值。只有在需要的情況下才從喚醒()來設置KCC。

KCC資料

KCCData是核心資料架構以儲存 運行階段 資料。它含有:

  • Metadata - 幀、刷新、差量時間、內插補點起始等等
  • Persistent data - 位置、查看旋轉
  • Input values - 輸入方向、跳躍震動、重力等等
  • Intermediate calculations - 動態速度、運動學速度等等
  • Physics query results - 地面法線、是否在地面上等等
  • Move information - 已經傳送、已經跳躍。在邊際上等等
  • Collisions - 與KCC互動的已連網碰撞的集合
  • Modifiers - 與KCC互動的手動登錄的調整器/處理器的集合
  • Ignores - 被忽略碰撞器的集合
  • Hits - KCC重疊的所有碰撞器/觸發器的集合

與移動計算相關的一些重要屬性:

  • Alpha - 在兩個固定刷新時間之間的時間的相對位置。有效值是 <0.0f,1.0f&gt;
  • DeltaTime - 部分差量時間,如果CCD是啟用中則可變。有效值是 <0.0f, UpdateDeltaTime>,但是可以被更改。
  • UpdateDeltaTime - 轉譯更新的差量時間/固定刷新(CCD獨立)。
  • BasePosition - 在移動之前的基礎位置,在各個KCC步的開始時以TargetPosition初始化。
  • DesiredPosition - 在取消穿透及後處理之前的期望位置。
  • TargetPosition - (在取消穿透後的)最終計算或明確設定的位置,其被散佈到Transform
  • LookRotation - KCC的查看旋轉(俯仰+偏擺)
  • TransformRotation - KCC的偏擺旋轉(沒有俯仰)
  • InputDirection - 非內插補點世界空間輸入指示 - 基於鍵盤/搖桿/導航網格/等等
  • JumpImpulse - 世界空間跳躍震動向量
  • Gravity - 重力向量
  • KinematicVelocity - 從InputDirectionKinematicDirectionKinematicTangentKinematicSpeed計算的速度。
  • DynamicVelocity - 從GravityExternalVelocityExternalAccelerationExternalImpulseExternalForceJumpImpulse計算的速度。
  • IsGrounded - 指出KCC正在以低於MaxGroundAngle的法線角度來觸碰一個碰撞器的旗標。

如需更多關於KCCData屬性的資訊,請查看在KCCData.cs檔案中的已評論的源程式碼。

KCC進一步區別資料是否與固定更新或轉譯更新相關:

  • 固定資料 - 預設在 固定更新 中使用的KCCData執行個體 - FixedUpdateNetwork() (可透過KCC.FixedData屬性存取)
  • 轉譯資料 - 預設在 轉譯更新 中使用的KCCData執行個體 - Render() (可透過KCC.RenderData屬性存取)
  • 歷史資料 - KCCData執行個體(固定資料備份,可透過KCC.GetHistoryData(int tick)存取)以在新的快照從伺服器抵達時儲存來自本機歷史的資料

⚠️ KCC也含有屬性KCC.Data,其自動地解析固定更新或轉譯更新是否目前為啟用中,並且傳回正確的執行個體。

以下圖表展示了資料流,在 轉譯預測 背後的機制,使用 本機歷史 及核對從伺服器接收的資料(儲存在網路緩衝中)。

KCC data flow
KCC資料流。

幀1

  • 模擬兩個Fusion刷新,在模擬期間由KCC使用Fixed Data
  • 在每個刷新之後,複製Fixed Data 到本機歷史
  • 在刷新2的結尾時,來自Fixed Data的值也被複製到Render Data(以針對轉譯來準備資料)。
  • Render()中,KCC只與Render Data協同工作。

幀2/3

  • 沒有足夠的差量時間來模擬下一個Fusion刷新。
  • 只執行Render(),並且KCC以來自先前的幀的Render Data繼續。

幀4

  • 新的資料從伺服器而抵達,在網路緩衝中附有刷新1快照。
  • 針對刷新1的整個Fixed Data 從本機歷史 被儲存。
  • 在已儲存的Fixed Data的頂端應用來自Network Buffer的值 => 有效地以來自伺服器的正確的狀態來覆寫所有已連網屬性。
  • 重新模擬刷新2,在結束時複製Fixed Data到本機歷史。
  • 針對刷新3的轉傳模擬,經過了足夠時間,在結束時複製Fixed Data到本機歷史,並且也複製Fixed DataRender Data(以針對轉譯來準備資料)。
  • Render()中,KCC只與Render Data協同工作。

以上的方法確保轉譯預測完全地從固定模擬分離。
當有足夠的差量時間來模擬下一個固定刷新,先前轉譯的結果就會被捨棄,接下來的轉譯將從最新的固定刷新的狀態開始。

Back to top