Architecture
{toc NoHeader %} このセクションでは、KCCと他のコンポーネントとの関係や通信フローについて説明します。
コライダー
- KCCのコライダーは子ゲームオブジェクトとして実行時に生成されます。
- コライダーゲームオブジェクトのレイヤーは
KCCSettings.ColliderLayer
で制御され、ネットワーク上で同期されます。
Rigidbody
Rigidbody
コンポーネントはKCC
によって必要とされ、物理エンジンに位置を同期するために使われます。Is Kinematic
フラグを有効にする必要があります(スポーン時に強制されます)。
Transform
- Transformコンポーネントは書き込み専用です。
- 位置と回転はスポーン時に一度だけ読み込まれます。
以下の図は、KCCがどのように動作するかを高レベルの視点から示しています:
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()
はKCCSettings
のRadius
プロパティを設定し、その値を即座に collider に伝える。
Core Loop
- 物理クエリ、コリジョンフィルタリング、ディペネトレーション、ネットワーキング、コライダーのトラッキング、段差の検出、地面のスナップ、ネットワーキング、...などの基本的な機能を処理する。
- Data Layerからの読み書き。
- 依存性の注入(Interaction Scripts)を介して、動きを制御するためのステージを実行します。
以下の図は、特定のケースにおける上記の単純化されたアプリケーションを示しています
Player
は Gameplay Scripts を表す。Environment Processor
とTeleport Processor
はInteraction Scriptsを表す。実行は以下の順序で行われます。
- FixedUpdateNetwork()
が
Player`で呼ばれる。 - Player
スクリプトはキーボードまたはジョイスティックからの入力に基づいたカスタムベクトルで
KCC.SetInputDirection()`を呼び出す。 KCC
は希望する入力方向をKCCData.InputDirection
(Data Layer) に書き込む。KCC
でFixedUpdateNetwork()
が呼ばれる。KCC
は一連のコマンドを実行し、Interaction Scripts (KCC Processors) によって移動のためのデータを計算する。KCC
はPrepareData
ステージを、このステージをサポートするすべてのプロセッサ (この場合はEnvironment Processor
) で実行する。Environment Processor
は、入力された方向とその他のプロパティを組み合わせて、結果としてKCCData.DynamicVelocity
とKCCData.KinematicVelocity
を計算するステージのセットを内部的に実行する。- この時点ですべてのステージが実行され、
KCC
は実際の移動ロジックに進む。 KCC
は計算されたすべての速度と外部デルタを組み合わせて、位置デルタ候補にする。KCC
は前のステップで計算されたデルタでコライダーを移動し、重なっているコライ ダーを削除し、内部の衝突リストを更新する。KCC
は新しく進入/離脱したコライダーに対してOnEnter()
/OnExit()
コールバックを呼び出す(この場合Teleport Processor
=>OnEnter()
)。Teleport Processor
はKCC.SetPosition()
をターゲットの位置で呼び出す。KCC.SetPosition()
は直ちにKCC
を指定された位置にテレポートし、KCCData.HasTeleported
フラグをセットしてそれ以降の実行を停止する(テレポート後に移動を続けたくない)。KCC
はすべてのコールバックを実行した後、コアループを再開する。KCC
がKCCData.HasTeleported
フラグをチェックして早期終了を確認する(この場合は true に設定されている)。KCC
は現在の更新の実行を終了する(残りの位置の差分をスキップする)。
お察しの通り、動きは多くの異なるプロセッサーを使って設計することができ、それぞれが独自のロジックを提供/注入する。詳細はInteractionsセクションを参照してください。
Back to top