Movement
移動步驟
以下方程式用於計算單一移動步驟的期望位置增量:
步驟位置增量 = (動態速度 + 運動速度) * 時間增量 + 外部增量
動態速度
- 累積外部力的速度
- 重力、爆炸衝擊力、力場、跳躍板
- 可以將 KCC 推上斜坡
- 使用預設
EnvironmentProcessor時的相關 API:KCCData.DynamicVelocityKCC.SetDynamicVelocity()KCC.AddExternalForce()KCC.AddExternalImpulse()KCC.Jump()
運動速度
- 由用戶輸入動作計算的無約束速度
- 通常基於
KCCData.InputDirection(入口點) - 只有可行走的表面會將 KCC 推上,以防止在陡峭斜坡上出現偽影(由
KCCData.MaxGroundAngle控制) - 使用預設
EnvironmentProcessor時的相關 API:KCCData.KinematicVelocityKCC.SetInputDirection()KCC.SetKinematicDirection()KCC.SetKinematicSpeed()KCC.SetKinematicVelocity()
外部增量
- 絕對位置偏移
- 用於在移動步驟結束時進行校正(在解除穿透後)
- 相關 API:
KCCData.ExternalDeltaKCC.SetExternalDelta()
移動演算法
KCC 的虛擬膠囊體總是透過計算的位置增量移動,然後從重疊的碰撞體中解除穿透。
- ✅ 這種方法提供了自然的幾何滑動效果。
- ✅ 大多數情況下只需要單一膠囊體重疊,這使得 KCC 非常高效。
- ❌ 有時在移動時會因多個碰撞體(通常是某些角落)而產生抖動,但這通常可以透過運行更多的解除穿透步驟來解決。
連續碰撞檢測 (CCD)
如果角色移動過快(單一步驟的位置增量大於半徑的 75%),則會將移動分為子步驟以避免穿過幾何體。
- 根據期望速度將移動分為較小的步驟。
- 單一步驟中的最大移動距離為半徑的 25-75%,由
KCC Settings資產中的CCD Radius Multiplier屬性控制。 - 75% 在大多數情況下效果良好,只有在 KCC 穿過幾何體時才降低此值。
- 在降低
CCD Radius Multiplier之前,嘗試增加KCC Settings資產中的Max Penetration Steps(提高解除穿透的品質)。
碰撞過濾
- 主要過濾器是碰撞層遮罩 - 由
KCC Settings資產中的Collision Layer Mask屬性控制。KCC 不使用 物理設定 中的 層碰撞矩陣。 - 可以透過
KCC.SetIgnoreCollider()明確忽略靜態碰撞體或實體。 - 使用
KCCContext.PrepareUserContext()設置ResolveCollision委派,以應用其他過濾規則。