This document is about: FUSION 2
SWITCH TO

Architecture

{toc NoHeader %} このセクションでは、KCCと他のコンポーネントとの関係や通信フローについて説明します。


コライダー

  • KCCのコライダーは子ゲームオブジェクトとして実行時に生成されます。
  • コライダーゲームオブジェクトのレイヤーはKCCSettings.ColliderLayerで制御され、ネットワーク上で同期されます。

Rigidbody

  • RigidbodyコンポーネントはKCCによって必要とされ、物理エンジンに位置を同期するために使われます。
  • Is Kinematicフラグを有効にする必要があります(スポーン時に強制されます)。

Transform

  • Transformコンポーネントは書き込み専用です。
  • 位置と回転はスポーン時に一度だけ読み込まれます。

以下の図は、KCCがどのように動作するかを高レベルの視点から示しています:

kcc architecture
High-level KCC architecture.

Gameplay Scripts

  • KCCに命令するユーザースクリプトで、「何をするか」を表します(指定された方向に移動する、位置を見る、特定のコライダーを無視する、ジャンプをする、しゃがみを有効にする、...)。
  • Data Layerから情報を読み込む(例えばIs Grounded, Real Velocity, ...)。
  • Public API (KCC.SetInputDirection(), KCC.SetLookRotation(), KCC.Jump())を呼び出す。
  • Interaction Scriptsと相互運用できる。
  • 例えば、入力(マウスのデルタ)をKCCのアクション(KCC.SetLookRotation())に変換するPlayerクラス。

Interaction Scripts

  • (IKCCProcessorを実装した)ユーザースクリプトで、"どのように動くか "を表現します(地面に接地している間は入力方向を投影し、しゃがんでいる間は速度を50%遅くし、希望の速度を計算します)。
  • ロジックは Core Loop 実行中に間接的に注入される。
  • Data Layer*に直接書き込むか、Public APIを呼び出す。
  • Gameplay Scriptsと相互運用できる。
  • 他の NetworkBehaviour のようにカスタムロジックを実装できる。
  • 例えば、DashProcessorクラスは起動時にKCCの移動速度を5秒間強制的にオーバーライドする。

Public API

  • KCCの実行フロー、機能、現在の状態(別のコマンドの実行、Data Layer への書き込み、安全性のチェック)と互換性があるように、即座に実行されるか、内部で変換されるコマンドのセットを提供する。
  • 抽象的な複雑さをユーザーから遠ざける。
  • 例えば、KCC.SetRadius()KCCSettingsRadius プロパティを設定し、その値を即座に collider に伝える。

Core Loop

  • 物理クエリ、コリジョンフィルタリング、ディペネトレーション、ネットワーキング、コライダーのトラッキング、段差の検出、地面のスナップ、ネットワーキング、...などの基本的な機能を処理する。
  • Data Layerからの読み書き。
  • 依存性の注入(Interaction Scripts)を介して、動きを制御するためのステージを実行します。

以下の図は、特定のケースにおける上記の単純化されたアプリケーションを示しています

kcc execution flow example
KCC execution flow example.

PlayerGameplay Scripts を表す。Environment ProcessorTeleport ProcessorInteraction Scriptsを表す。実行は以下の順序で行われます。

  1. FixedUpdateNetwork()Player`で呼ばれる。
  2. Playerスクリプトはキーボードまたはジョイスティックからの入力に基づいたカスタムベクトルでKCC.SetInputDirection()`を呼び出す。
  3. KCC は希望する入力方向を KCCData.InputDirection (Data Layer) に書き込む。
  4. KCCFixedUpdateNetwork() が呼ばれる。
  5. KCC は一連のコマンドを実行し、Interaction Scripts (KCC Processors) によって移動のためのデータを計算する。
  6. KCCPrepareData ステージを、このステージをサポートするすべてのプロセッサ (この場合は Environment Processor) で実行する。
  7. Environment Processorは、入力された方向とその他のプロパティを組み合わせて、結果として KCCData.DynamicVelocityKCCData.KinematicVelocity を計算するステージのセットを内部的に実行する。
  8. この時点ですべてのステージが実行され、KCCは実際の移動ロジックに進む。
  9. KCC は計算されたすべての速度と外部デルタを組み合わせて、位置デルタ候補にする。
  10. KCC は前のステップで計算されたデルタでコライダーを移動し、重なっているコライ ダーを削除し、内部の衝突リストを更新する。
  11. KCC は新しく進入/離脱したコライダーに対して OnEnter()/OnExit() コールバックを呼び出す(この場合 Teleport Processor => OnEnter())。
  12. Teleport ProcessorKCC.SetPosition() をターゲットの位置で呼び出す。
  13. KCC.SetPosition()は直ちにKCCを指定された位置にテレポートし、KCCData.HasTeleportedフラグをセットしてそれ以降の実行を停止する(テレポート後に移動を続けたくない)。
  14. KCC はすべてのコールバックを実行した後、コアループを再開する。
  15. KCCKCCData.HasTeleported フラグをチェックして早期終了を確認する(この場合は true に設定されている)。
  16. KCC は現在の更新の実行を終了する(残りの位置の差分をスキップする)。

お察しの通り、動きは多くの異なるプロセッサーを使って設計することができ、それぞれが独自のロジックを提供/注入する。詳細はInteractionsセクションを参照してください。

Back to top