This document is about: FUSION 2
SWITCH TO

データレイヤー

KCC 設定

KCC は、デフォルトの設定としてコンポーネントインスペクタにいくつかのプロパティを公開しています。これらの値は、ランタイム中にさらに設定可能です。

KCC settings
KCC settings

ネットワーク設定

これらの設定はデフォルトでネットワーク越しに同期されており、サーバー上での変更はすべてのクライアントに自動的に伝播されます。クライアント上でのローカルオーバーライドは、次回の再シミュレーションティックの前に元に戻されます。

  • Shape - KCC の物理挙動を定義します。
    • None - 内部物理クエリをスキップし、コライダーは非表示になります。他のロジックは引き続き実行可能です。
    • Capsule - 完全な物理処理が行われ、カプセルコライダーが子ゲームオブジェクトとしてインスタンス化されます。
  • Is Trigger - KCC コライダーがトリガーとしてマークされます。
  • Radius - コライダーの半径。
  • Height - コライダーの高さ。
  • Extent - 周囲のコライダー検出用の追加半径を定義します。低い値は安定性を低下させ、追加チェックを実行する際にパフォーマンスに影響を与える可能性があります。高い値は安定性を高めますが、持続的なパフォーマンスへの影響が増大します。推奨範囲は Radius の 10-20% です。
  • Collider Layer - コライダーゲームオブジェクトのレイヤー。
  • Collision Layer Mask - KCC が衝突するレイヤーマスク。
  • Features - KCC 機能のデフォルト設定(ランタイム値は上書き可能)。詳細情報は Features セクションに記載されています。
    - CCD - 連続衝突検出を有効にし、ジオメトリを通り抜けるのを防ぎます。
    • Anti Jitter - 移動距離の許容値を有効にします(Transform に適用される位置のデルタ)。
    • Prediction Correction - 不正確な予測の場合にスムーズな修正を有効にします(固定更新とレンダー更新の両方で不正確な予測を解決します)。
  • Input Authority Behavior - 入力権限を持つ KCC の更新動作を定義します。オブジェクトが同時に入力権限と状態権限を持つ場合、これは State Authority Behavior よりも優先されます。
    • Predict Fixed | Interpolate Render - 固定更新での完全な処理/予測、およびレンダー更新での最後の2つの予測された固定更新状態間の補間(デフォルト)。
    • Predict Fixed | Predict Render - 固定更新での完全な処理/予測、レンダー更新でもの完全な処理/予測。
  • State Authority Behavior - 状態権限を持つ KCC の更新動作を定義します。
    • Predict Fixed | Interpolate Render - 固定更新での完全な処理/予測、およびレンダー更新での最後の2つの予測された固定更新状態間の補間(デフォルト)。
    • Predict Fixed | Predict Render - 固定更新での完全な処理/予測、レンダー更新でもの完全な処理/予測。
  • Proxy Interpolation Mode - 補間の動作を定義します。固定更新で予測されたプロキシは常に完全に補間されます。
    • Full - KCCSettings と KCCData のすべてのネットワークプロパティを補間し、補間がトリガーされるたびに Transform と Rigidbody コンポーネントを同期します(デフォルト)。
    • Transform - 位置と回転のみを補間し、Transform コンポーネントを同期します。このモードは最も高速ですが、ほとんどの KCCSettings および KCCData プロパティは同期されません。
  • Allow Client Teleports - クライアントが開始したテレポート RPC の実行を許可します。

ローカル設定

これらの設定はネットワーク上で同期されず、サーバーまたはクライアントでの変更は常にローカルのものです。

  • Processors - 初期化時に KCC.LocalProcessors に伝播するデフォルトプロセッサのリストです。任意の IKCCProcessor をここにリンクできます。プロセッサに関する詳細情報は Interactions セクションで確認できます。
  • Teleport Threshold - KCC が瞬時の移動(テレポート)と見なすために、単一ティックで移動しなければならない最小距離を定義します。これにより補間にも影響します。
  • Max Penetration Steps - 単一の移動/CCDステップが複数の小さなサブステップに分割され、全体的な脱侵入品質が向上します。
  • CCD Radius Multiplier - KCC が単一の CCD ステップで移動する最大距離を制御します。有効な範囲は半径の 25% ~ 75% です。キャラクターがジオメトリを通り抜ける場合は、低い値を使用してください。この設定は EKCCFeature.CCD が有効な場合にのみ有効です。CCD Max Step Distance = Radius * CCD Radius Multiplier
  • Anti Jitter Distance - ジオメトリからの脱侵入によって引き起こされるジャターを平滑化するためのレンダーポジションの距離の許容範囲を定義します。値が高いほどジャターは減少しますが、移動方向を切り替える際に顕著な遅延が発生する可能性があります。
    • X = 水平方向の軸。
    • Y = 垂直方向の軸。
  • Prediction Correction Speed - 予測誤差がゼロに向かって補間される速さです。予測補正に関する詳細情報は Features セクションで確認できます。
  • Networked Interactions - ネットワーク上で同期される最大インタラクション(衝突、モディファイア、無視されたコライダー)です。インタラクションに関する詳細情報は Interactions セクションで確認できます。
  • Compress Network Position - 圧縮された位置情報をネットワーク上で同期することでネットワークトラフィックを減少させますが、精度は犠牲になります。NPC(非プレイヤーキャラクター)に役立ちます。
  • Force Single Overlap Query - 移動中に単一のオーバーラップクエリを実行します。ヒットは脱侵入前の位置で追跡されます。これはパフォーマンスの最適化であり、NPCに対して可能性のある移動の誤りが生じることがあります。
  • Force Predicted Look Rotation - ローカルキャラクターのレンダーにおけるルック回転の補間をスキップします。これにより、他のプロパティはまだ補間される中で、追加のルック応答性を得ることができます。
  • Suppress Convex Mesh Colliders - 常に非凸メッシュコライダーに対して衝突をチェックするように有効にすることで、ゴースト衝突や不正確な侵入ベクトルを防ぎます。詳細情報は Known problems セクションで確認できます。

コードからの設定の変更

設定は、プロパティ 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);
    }
}

⚠️ KCC は自動的に Spawned() で設定をバックアップし、Despawned() で復元します。このため、オブジェクトプーリングとの互換性があります。

`Awake()` で行った変更はオブジェクトプーリングと組み合わせると危険です。なぜなら、`Despawned()` ではインスペクタで設定された値に対して設定がリセットされないからです。この動作が望ましい場合のみ、`Awake()` から KCC を設定してください。

KCC データ

KCCDataランタイム データを格納するためのコアデータ構造で、以下を含みます。

  • 永続データ - 位置、ルック回転、時間、補間アルファ、…
  • 入力値 - 入力方向、ジャンプインパルス、重力、…
  • 中間計算 - 動的速度、運動速度、…- 物理クエリ結果 - 地面の法線、地面に接しているかどうか、…
  • 移動情報 - テレポートしたかどうか、ジャンプしたかどうか、エッジにいるかどうか、…
  • 衝突 - KCC が相互作用するネットワーク化された衝突のコレクション
  • モディファイア - KCC が相互作用する手動で登録されたモディファイア/プロセッサのコレクション
  • 無視されたコライダー - 無視されるコライダーのコレクション
  • ヒット - KCC が重なり合うすべてのコライダー/トリガーのコレクション

移動計算に関連するいくつかの重要なプロパティ:

  • Alpha - 2つの固定ティックタイム間の時間の相対的な位置。有効な範囲は <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 - InputDirectionKinematicDirectionKinematicTangent、および KinematicSpeed から計算される速度。
  • DynamicVelocity - GravityExternalVelocityExternalAccelerationExternalImpulseExternalForce および JumpImpulse から計算される速度。
  • IsGrounded - KCCMaxGroundAngle よりも法線角が小さいコライダーに接触していることを示すフラグ。

KCCData プロパティに関する詳細情報は、KCCData.cs ファイル内のコメント付きソースコードを確認してください。

KCC はデータが固定更新に関連しているかレンダー更新に関連しているかをさらに区別します:

  • 固定データ - 固定更新 でデフォルトで使用される KCCData インスタンス - FixedUpdateNetwork()KCC.FixedData プロパティを介してアクセス可能)
  • レンダーデータ - レンダー更新 でデフォルトで使用される KCCData インスタンス - Render()KCC.RenderData プロパティを介してアクセス可能)
  • 履歴データ - KCCData インスタンス(固定データのバックアップ、KCC.GetHistoryData(int tick) を介してアクセス可能)で、新しいスナップショットがサーバーから到着した際にローカルの履歴からデータを復元するために使用されます。

⚠️ KCC にはプロパティ KCC.Data も含まれており、これにより現在アクティブな更新が固定更新かレンダー更新かを自動的に解決し、適切なインスタンスを返します。

以下の図は、データフロー、レンダー予測 の背後にあるメカニズム、ローカル履歴 の使用、およびサーバーから受信したデータの調整(ネットワークバッファに保存されている)を示しています。

KCC data flow
KCC data flow.

フレーム 1

  • 2つのフュージョンティックがシミュレーションされ、シミュレーション中は KCC によって Fixed Data が使用されます。
  • 各ティック後に Fixed Dataローカル履歴 にコピーされます。
  • ティック 2 の終了時に、Fixed Data の値も Render Data にコピーされます(レンダー用データの準備のため)。
  • Render() 内では KCC は Render Data のみを使用します。

フレーム 2/3

  • 次のフュージョンティックをシミュレーションするための十分なデルタ時間がありません。
  • Render() のみが実行され、KCC は前のフレームからの Render Data を使用して続行します。

フレーム 4

  • サーバーから新しいデータが到着し、ネットワークバッファにティック 1 のスナップショットが保存されています。
  • ティック 1 の完全な Fixed Dataローカル履歴 から復元されます。
  • Network Buffer の値が復元された Fixed Data の上に適用され、結果としてすべてのネットワークプロパティがサーバーからの正しい状態で上書きされます。
  • ティック 2 の再シミュレーションが行われ、終了時に Fixed Data がローカル履歴にコピーされます。
  • ティック 3 の前方シミュレーションに十分な時間が経過し、終了時に Fixed Data がローカル履歴にコピーされ、さらに Fixed DataRender Data にコピーされます(レンダー用データの準備のため)。
  • Render() 内では KCC は Render Data のみを使用します。

上記のアプローチは、レンダー予測が固定シミュレーションから完全に分離されることを保証します。次の固定ティックをシミュレーションするための十分なデルタ時間がある場合、前のレンダーの結果は破棄され、次のレンダーは最新の固定ティックからの状態で開始されます。

Back to top