Data Layer
KCC設定
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>;DeltaTime
- 部分差量時間,如果CCD是啟用中則可變。有效值是 <0.0f,UpdateDeltaTime
>,但是可以被更改。UpdateDeltaTime
- 轉譯更新的差量時間/固定刷新(CCD獨立)。BasePosition
- 在移動之前的基礎位置,在各個KCC步的開始時以TargetPosition
初始化。DesiredPosition
- 在取消穿透及後處理之前的期望位置。TargetPosition
- (在取消穿透後的)最終計算或明確設定的位置,其被散佈到Transform
。LookRotation
- KCC的查看旋轉(俯仰+偏擺)TransformRotation
- KCC的偏擺旋轉(沒有俯仰)InputDirection
- 非內插補點世界空間輸入指示 - 基於鍵盤/搖桿/導航網格/等等JumpImpulse
- 世界空間跳躍震動向量Gravity
- 重力向量KinematicVelocity
- 從InputDirection
、KinematicDirection
、KinematicTangent
及KinematicSpeed
計算的速度。DynamicVelocity
- 從Gravity
、ExternalVelocity
、ExternalAcceleration
、ExternalImpulse
、ExternalForce
及JumpImpulse
計算的速度。IsGrounded
- 指出KCC
正在以低於MaxGroundAngle
的法線角度來觸碰一個碰撞器的旗標。
如需更多關於KCCData
屬性的資訊,請查看在KCCData.cs
檔案中的已評論的源程式碼。
KCC
進一步區別資料是否與固定更新或轉譯更新相關:
- 固定資料 - 預設在 固定更新 中使用的
KCCData
執行個體 -FixedUpdateNetwork()
(可透過KCC.FixedData
屬性存取) - 轉譯資料 - 預設在 轉譯更新 中使用的
KCCData
執行個體 -Render()
(可透過KCC.RenderData
屬性存取) - 歷史資料 -
KCCData
執行個體(固定資料備份,可透過KCC.GetHistoryData(int tick)
存取)以在新的快照從伺服器抵達時儲存來自本機歷史的資料
⚠️ KCC
也含有屬性KCC.Data
,其自動地解析固定更新或轉譯更新是否目前為啟用中,並且傳回正確的執行個體。
以下圖表展示了資料流,在 轉譯預測 背後的機制,使用 本機歷史 及核對從伺服器接收的資料(儲存在網路緩衝中)。
幀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 Data
到Render Data
(以針對轉譯來準備資料)。 - 在
Render()
中,KCC只與Render Data
協同工作。
以上的方法確保轉譯預測完全地從固定模擬分離。
當有足夠的差量時間來模擬下一個固定刷新,先前轉譯的結果就會被捨棄,接下來的轉譯將從最新的固定刷新的狀態開始。