カスタムコリジョンの必要性
Unreal Engine (UE) でゲーム開発を始めたばかりの頃は、デフォルトで用意されている WorldStatic や Pawn といったコリジョンチャンネルで事足りるかもしれません。しかし、ゲームの複雑性が増すにつれて、すぐに壁にぶつかります。
具体的な問題提起:
- 「特定の種類の武器の弾丸だけを、特定の敵のシールドで防ぎたい」
- 「プレイヤーキャラクターだけが反応する、透明なトリガーゾーンを作りたい」
- 「環境オブジェクト(例:破壊可能な壁)と、それ以外の静的オブジェクト(例:地面)を区別して処理したい」
このような、「AというオブジェクトとBというオブジェクトが衝突したときだけ特別な処理をしたい」 という細かな制御は、汎用的なチャンネルだけでは実現できません。すべてを Block や Overlap に設定してしまうと、意図しない衝突やパフォーマンスの低下を招きます。
本記事では、この課題を解決する鍵となるカスタムコリジョンチャンネル とコリジョンプロファイル の活用法を、初心者から中級者向けに徹底解説します。これらをマスターすることで、あなたのゲームの衝突判定ロジックは、より明確に、より効率的に管理できるようになります。
コリジョ ンチャンネルとプロファイルの役割
カスタムコリジョンを理解するためには、まず「チャンネル」と「プロファイル」の二つの概念を明確に区別する必要があります。
1. コリジョンチャンネル (Collision Channel)
コリジョンチャンネルは、オブジェクトの種類を識別するための「タグ」のようなものです。UEでは、主に以下の2種類があります。
| チャンネルの種類 | 役割 | 主な用途 |
|---|---|---|
| オブジェクトチャンネル (Object Channel) | オブジェクト自身が「何であるか」を定義する。 | Static Mesh, Skeletal Mesh, Characterなどのコンポーネントに設定される。 |
| トレースチャンネル (Trace Channel) | レイキャストやシェイプトレースといったクエリが「何を検出したいか」を定義する。 | 視線チェック、武器のヒット判定、環境スキャンなどに使用される。 |
デフォルトでは WorldStatic, Pawn, PhysicsBody などが用意されていますが、プロジェクト設定から最大18個までカスタムチャンネルを追加できます。
2. コリジョンプロファイル (Collision Profile)
コリジョンプロファイルは、オブジェクトチャンネルに対する応答設定 をひとまとめにしたプリセットです。
例えば、「プレイヤー」というオブジェクトチャンネルを持つアクターがあったとします。このアクターに「デフォルトのPawn」というコリジョンプロファイルを適用すると、そのプロファイルに定義された 応答(例:WorldStaticはBlock、ProjectileはOverlapなど)が自動的に適用されます。
コリジョンプロファイルの構成要素:
- Object Type: そのプロファイルを持つオブジェクト自身のチャンネル(例:
Pawn)。 - Collision Responses: 他のすべてのオブジェクトチャンネル(カスタムチャンネルを含む)に対する応答(
Ignore,Overlap,Block)のリスト。
カスタムチャンネルの作成手順
複雑なロジックを実現するために、まずはカスタムチャンネルを作成します。ここでは「プレイヤーのシールド」と「敵の弾丸」を区別するためのチャンネルを作成する例を考えます。
ステップ1: プロジェクト設定を開く
Edit -> Project Settings を開き、Engine -> Collision セクションに移動します。
ステップ2: 新しいオブジェクトチャンネルを追加
Object Channels の項目で New Object Channel... をクリックし、以下のチャンネルを追加します。
| チャンネル名 | デフォルト応答 | 備考 |
|---|---|---|
Player_Shield | Block | プレイヤーのシールドコンポーネントに設定します。 |
Enemy_Projectile | Ignore | 敵の弾丸コンポーネントに設定します。 |
デフォルト応答の重要性:
ここで設定するデフォルト応答は、そのチャンネルに対する応答がプロファイルで明示的に定義されていない場合 に適用されます。通常は Ignore に設定し、必要なプロファイルでのみ Block や Overlap に上書きするのがベストプラクティスです。
カスタムプロファイルの作成
次に、作成したカスタムチャンネルを活用するためのコリジョンプロファイルを作成します。
ステップ1: 新しいプリセット(プロファイル)を作成
Preset の項目で New をクリックし、以下の2つのプロファイルを作成します。
プロファイル1: Shield_Active
このプロファイルは、プレイヤーのシールドコンポーネントに適用されます。
| 設定項目 | 値 |
|---|---|
| Preset Name | Shield_Active |
| Collision Enabled | Query and Physics |
| Object Type | Player_Shield (←先ほど作成したカスタムチャンネル) |
Collision Responses の設定:
| チャンネル | 応答 | 理由 |
|---|---|---|
Enemy_Projectile | Block | 敵の弾丸はシールドで防ぐ。 |
Pawn | Overlap | プレイヤー自身はシールドをすり抜ける。 |
WorldStatic | Ignore | シールドは環境に影響されない。 |
| その他 | Ignore | 必要なもの以外は無視してパフォーマンスを確保。 |
プロファイル2: Enemy_Bullet
このプロファイルは、敵の弾丸コンポーネントに適用されます。
| 設定項目 | 値 |
|---|---|
| Preset Name | Enemy_Bullet |
| Collision Enabled | Query Only (物理演算は不要な場合) |
| Object Type | Enemy_Projectile (←先ほど作成したカスタムチャンネル) |
Collision Responses の設定:
| チャンネル | 応答 | 理由 |
|---|---|---|
Player_Shield | Block | 弾丸はシールドに衝突して止まる。 |
Pawn | Overlap | プレイヤー本体に当たった場合はOverlapでダメージ処理を行う。 |
WorldStatic | Block | 弾丸は壁や地面に当たる。 |
BlueprintとC++での適用
コリジョンプロファイルは、Static Mesh ComponentやCapsule Componentなどのコンポーネントの詳細パネルで設定できますが、ゲーム中に動的に変更することも可能です。
Blueprintでの適用
特定のイベント(例:シールド発動)でコリジョンプロファイルを切り替えるには、Set Collision Profile Name ノードを使用します。
- 対象のコンポーネント(例:
ShieldMesh)を選択します。 Set Collision Profile Nameノードを呼び出します。In Profile Nameに、作成したプロファイル名(例:Shield_Active)を正確に入力します。
// Blueprintの擬似コード
// Event: シールド発動
-> ShieldMesh (StaticMeshComponent)
-> Set Collision Profile Name (In Profile Name: "Shield_Active")
💡 Set Collision Profile Nameノードについて
このノードは
In Profile Nameパラメータのみを受け取ります。プロファイル名はプロジェクト設定で定義した名前と完全に一致する文字列 を指定する必要があります。存在しないプロファイル名を指定した場合、警告ログが出力され、コリジョン設定は変更されません。
C++での適用
C++でコンポーネントのコリジョンプロファイルを初期設定または動的に変更するに は、SetCollisionProfileName 関数を使用します [3]。
// C++での初期設定例 (コンストラクタ内など)
// MyShieldComponentはUStaticMeshComponent*などのコリジョンを持つコンポーネント
MyShieldComponent->SetCollisionProfileName(TEXT("Shield_Active"));
// C++での動的変更例 (特定の関数内など)
void AMyCharacter::ActivateShield()
{
// FNameでプロファイル名を指定
static const FName ShieldProfile(TEXT("Shield_Active"));
MyShieldComponent->SetCollisionProfileName(ShieldProfile);
}
ベストプラクティスとよくある間違い
✅ ベストプラクティス
- チャンネルは必要最小限に抑える: カスタムチャンネルは最大18個までですが、チャンネル数が増えると応答設定の管理が複雑になり、パフォーマンスにも影響が出ます。「そのチャンネルがなければ実現できないロジックか?」 を常に自問自答しましょう。
- 明確な命名規則を採用する:
Custom1,Custom2のような曖昧な名前ではなく、Weapon_Laser,Destructible_Wallのように用途が明確な名前をつけましょう。 - プロファイルで一元管理する: アクターやコンポーネントの個別の応答設定(
Custom...)を直接変更するのではなく、コリジョンプロファイル(Preset)を作成し、それを適用する ことで、設定ミスを防ぎ、管理を容易にします。
❌ よ くある間違い
- Object Type と Trace Channel の混同:
- 間違い: 弾丸のコンポーネントの
Object TypeをPawnに設定し、レイキャストのTrace ChannelをEnemy_Projectileに設定する。 - 正解: 弾丸のコンポーネントの
Object TypeはEnemy_Projectileに設定し、レイキャストは検出したいオブジェクトのチャンネル(例:PawnやWorldStatic)をトレースします。
- 間違い: 弾丸のコンポーネントの
- 応答設定の過剰な Block:
- 間違い: すべてのカスタムチャンネルの応答をデフォルトで
Blockに設定する。 - 結果: 意図しないオブジェクト同士が衝突し、物理挙動がおかしくなったり、パフォーマンスが低下したりします。基本は
Ignoreにし、必要な組み合わせでのみBlockまたはOverlapに設定しましょう。
- 間違い: すべてのカスタムチャンネルの応答をデフォルトで
- カスタムチャンネルの適用忘れ:
- 間違い: プロジェクト設定でカスタムチャンネルを作成しただけで満足し、実際のアクターのコンポーネントの
Object Typeをデフォルトのままにしてしまう。 - 結果: 作成したプロファイルが正しく機能しません。カスタムチャンネルを使用するコンポーネントには、必ずそのチャンネルを
Object Typeとして設定する必要があります。
- 間違い: プロジェクト設定でカスタムチャンネルを作成しただけで満足し、実際のアクターのコンポーネントの
カスタムコリジョン活用のポイント
コリジョンプロファイルとカスタムコリジョンチャンネルは、Unreal Engineにおける複雑な衝突判定ロジックを整理し、効率的に実装する ための強力なツールです。
| 要点 | 説明 |
|---|---|
| カスタムチャンネル | オブジェクトの種類を細分化するための「タグ」。Object TypeとTrace Channelの2種類がある。 |
| コリジョンプロファイル | チャンネル間の応答(Ignore, Overlap, Block)を定義したプリセット。設定を一元管理できる。 |
| 実装の鍵 | 必要なチャンネルを定義し、そのチャンネルに対する応答をプロファイルとして作成し、コンポーネントに適用する。動的な変更には Set Collision Profile Name を使用する。 |
これらの機能を活用することで、あなたのゲームはより洗練され、デバッグしやすい衝突システムを持つことができるでしょう。