コリジョン タイプ
Unreal Engine のコリジョンは Unity と似ていますが、いくつかの違いについてここで説明します。 Unity のレイヤーベースのコリジョン検出を使用したことがある場合、プロジェクトのコリジョン設定はコリジョン マトリックスと似たものになります。 この設定にアクセスするには、[Edit (編集)] > [Project Settings (プロジェクト設定)] > [Collision (コリジョン)] に移動します。 [Presets (プリセット)] タブを展開すると、デフォルトのプリセット プロファイルとその機能の説明が表示されます。
Unreal Engine には、コリジョンの解決に関していくつかのオプションがあります。 これについては、「コリジョンの概要」で詳しく説明されています。 コリジョン検出におけるこのレベルの粒度は便利で、ゲームのパフォーマンス向上に役立ちます。 以下の点を理解しておくことが重要です。
チャンネルまたは個々のコライダーは、ブロッキング、オーバーラップ、または無視に設定できます。
よくある間違いとして、オーバーラップ イベントが必要なときに、コライダーの [Generate Overlap Events (オーバーラップ イベントの生成)] チェックボックスを正しく設定していないことが挙げられます。
静的ジオメトリはブロックしたりオーバーラップしたりする必要がありますが、ゲームプレイには必要ないため、必ずしもオーバーラップ イベントやヒット イベントを生成する必要はありません。
オブジェクトが他のオブジェクトをブロックしている場合でも、特に高速で移動している場合には、オーバーラップ イベントが生成される可能性があります。 Unity では、Rigidbody コンポーネントではなく平行移動を直接変更している場合、これが問題になることがあります。 これを行うと、物理の考慮が無視されてしまいます。
Unreal では、アクタのトランスフォームを更新する関数を呼び出す際に、アクタの動き方を指定する 2 つのブール型パラメータがあります。
Sweep を true に設定すると、オーバーラップがトリガーされ、ブロックされた場合は目的地の手前でアクタが停止します。 Teleport は、物理速度を維持するかどうかを決定します。
チャンネルは、Unity の物理キャスト (Raycast、SphereCast など) に相当するトレースにも 使用できます。 Unity の Raycast でレイヤー マスクを渡すのと同じように、ライン トレース関数の呼び出し時にチャンネルを渡すことができます。
Parrot のカスタム コリジョン タイプ
Parrot には、プレイヤー、砲弾、敵といったカスタム コリジョン オブジェクト チャンネルがいくつか用意されています。
これらのオブジェクト タイプを追加することで、Parrot は、ワールド内でコリジョン トレースが発生した際に、これらのオブジェクト チャンネルがトレース チャンネルとどのように相互作用するかを正確に制御できます。 デフォルトの応答は、通常実行される動作に設定されていますが、必要に応じてカスタマイズできます。 Parrot には、プレイヤー、OverlapAllPlayers、BlockAllPlayers、砲弾、敵のカスタム トレース チャンネル プリセットもいくつか用意されています。
これらのプリセットは、ゲームプレイ トリガーに特に便利です。 たとえば、OverlapAllPlayers は他のすべてのコリジョンを無視し、プレイヤーのコリジョン オブジェクト タイプのコリジョン イベントにのみ反応します。 ゲーム内のさまざまなメッシュのコリジョン設定を確認すると、これらのプリセットが頻繁に使用されていることがわかります。
コリジョン設定は、必要に応じてメッシュごとにカスタマイズすることもできます。
ワールド境界
レベルを作成する際に注意すべき点の 1 つがワールド境界です。 これは、[World Settings (ワールド設定)] > [World (ワールド)] から設定できます。 アクタが定義されたワールド境界にインタラクトした際に、カスタムのダメージ タイプを実装できます。 Parrot の境界は、KillZ のワールド設定と範囲外トリガー ボリュームを組み合わせて使用します。
トリガー ボリューム
Unreal Engine には、イベントをトリガーするために使用できるトリガー ボリューム アクタが組み込まれています (「Trigger ボリューム アクタ」を参照)。 デベロッパーが Parrot でこれらを使用する例としては、範囲外やフィニッシュ ラインのトリガー ボリュームが挙げられます。 トリガー ボリュームはレベル ブループリントと組み合わせて使用されることがよくありますが (デベロッパー向けドキュメント「Parrot のレベル ブループリント」を参照)、必ずしも組み合わせる必要はありません。 Parrot の範囲外トリガーは、シンプルなイベント グラフを持つボックス トリガーです。
[Details (詳細)] パネルでアクタのコリジョン設定を確認すると、コリジョン チャンネル プリセットがほとんどの処理を行っていることがわかります。
パワー ピックアップ
Parrot のパワーアップ ピックアップ実装を使用したコリジョン システムの実例を見てみましょう。 [Content (コンテンツ)] > [Blueprints(ブループリント)] > [Pickups (ピックアップ)] の下にあるBP_PickupBase を開いてビューポートを確認すると、コリジョン コンポーネントを含む階層を確認できます。
コリジョン設定と範囲外には、プレイヤーとのオーバーラップ イベントを生成するトリガー プリセットがあります。
イベント グラフを見ると、その他のアクタをパラメータとして持つ ActorBeginOverlap イベントがあることがわかります。 このイベントは Unity の OnCollisionEnter とほぼ同じように動作します。 違いは、コライダー コンポーネントを渡す代わりに、アクター自体が渡されることです。
Parrot はキャストを行い、アクタがオーバーラップしたプレイヤーであることを確認します。 その後、OnPickedUp イベントが呼び出されます。 これにより、派生したブループリント クラスは OnPickedUp に対する独自の動作を定義でき、基本クラスはアクタのオーバーラップ イベント自体を処理します。
デベロッパーは基本ブループリントを使用して、すべてのピックアップ時にサウンドを再生し、パーティクル エフェクトをスポーンするように処理します。 ピックアップ サウンドとパーティクル エフェクトの変数はインスタンス編集可能なので、派生クラスのクラス デフォルトに設定できます。 [Class Defaults (クラスのデフォルト)] は、ブループリント エディタ上部の [Compile (コンパイル)] ボタンの横にあります。
クラスのデフォルトを変更した例として、速度ピックアップが挙げられます。これは緑のパーティクルを使用する Niagara システムを使用しています (ハート ピックアップはピンク色を使用しています)。 同様に、ピックアップ メッシュ自体も派生ブループリントに設定できます。 オーバーラップ ロジックの最後のステップは、ピックアップ アクタを破棄することです。プレイヤーがピックアップした後は、ピックアップ アクタが残らないようにするためです。
わずか数個のノードで、派生ブループリントに簡単に拡張できる堅牢なロジックを作成できます。 すべての派生ブループリントは、アクタに紐付けられたオーバーラップ イベントから生成されます。
敵から飛び降りるプレイヤー キャラクター
もう一つの注目すべき例は、プレイヤーが敵から飛び降りる例です。 敵のカプセル コライダー タイプは「敵」で、プレイヤー オブジェクト タイプと衝突します。 剣を持った敵にも同様のオーバーラップ イベントが発生します。 これらは一般的にヒットボックスと呼ばれ、攻撃が有効な領域です。
しかし、プレイヤーが敵から飛び降りようとするとき、Parrot はどのようにこの問題を回避するのでしょうか。 解決策は、敵の頭にダメージボックスを配置することです。 プレイヤーがこのダメージボックス ボリュームにオーバーラップすると、プレイヤー キャラクターはキャラクターの位置、ダメージボックスの位置、およびダメージボックスの範囲に基づいて、有効なジャンプかどうかを一連のチェックで判断します。 チェックに合格すれば、プレイヤーはジャンプを実行し、敵に命中させることができます。 ここでも、重要な処理は、Parrot が考慮するオーバーラップ (プレイヤーのコリジョン オブジェクトとダメージボックス ボリューム上の敵) のみにフィルタリングするコリジョン チャンネルによって行われます。