【Unreal Engine】カスタムコリジョンチャンネルとプロファイルの設定方法

作成: 2025-12-12

プロジェクト固有のコリジョン判定を実現するためのカスタムチャンネルとプロファイルの作成方法を紹介。Object TypeとTrace Channelの違い、プロファイルによる応答設定のプリセット化、BlueprintとC++での適用方法などを整理。

カスタムコリジョンの必要性

Unreal Engine (UE) でゲーム開発を始めたばかりの頃は、デフォルトで用意されている WorldStaticPawn といったコリジョンチャンネルで事足りるかもしれません。しかし、ゲームの複雑性が増すにつれて、すぐに壁にぶつかります。

具体的な問題提起:

  • 「特定の種類の武器の弾丸だけを、特定の敵のシールドで防ぎたい」
  • 「プレイヤーキャラクターだけが反応する、透明なトリガーゾーンを作りたい」
  • 「環境オブジェクト(例:破壊可能な壁)と、それ以外の静的オブジェクト(例:地面)を区別して処理したい」

このような、「AというオブジェクトとBというオブジェクトが衝突したときだけ特別な処理をしたい」 という細かな制御は、汎用的なチャンネルだけでは実現できません。すべてを BlockOverlap に設定してしまうと、意図しない衝突やパフォーマンスの低下を招きます。

本記事では、この課題を解決する鍵となるカスタムコリジョンチャンネルコリジョンプロファイル の活用法を、初心者から中級者向けに徹底解説します。これらをマスターすることで、あなたのゲームの衝突判定ロジックは、より明確に、より効率的に管理できるようになります。


コリジョンチャンネルとプロファイルの役割

カスタムコリジョンを理解するためには、まず「チャンネル」と「プロファイル」の二つの概念を明確に区別する必要があります。

1. コリジョンチャンネル (Collision Channel)

コリジョンチャンネルは、オブジェクトの種類を識別するための「タグ」のようなものです。UEでは、主に以下の2種類があります。

チャンネルの種類役割主な用途
オブジェクトチャンネル (Object Channel)オブジェクト自身が「何であるか」を定義する。Static Mesh, Skeletal Mesh, Characterなどのコンポーネントに設定される。
トレースチャンネル (Trace Channel)レイキャストやシェイプトレースといったクエリが「何を検出したいか」を定義する。視線チェック、武器のヒット判定、環境スキャンなどに使用される。

デフォルトでは WorldStatic, Pawn, PhysicsBody などが用意されていますが、プロジェクト設定から最大18個までカスタムチャンネルを追加できます。

2. コリジョンプロファイル (Collision Profile)

コリジョンプロファイルは、オブジェクトチャンネルに対する応答設定 をひとまとめにしたプリセットです。

例えば、「プレイヤー」というオブジェクトチャンネルを持つアクターがあったとします。このアクターに「デフォルトのPawn」というコリジョンプロファイルを適用すると、そのプロファイルに定義された応答(例:WorldStaticBlockProjectileOverlapなど)が自動的に適用されます。

コリジョンプロファイルの構成要素:

  • Object Type: そのプロファイルを持つオブジェクト自身のチャンネル(例: Pawn)。
  • Collision Responses: 他のすべてのオブジェクトチャンネル(カスタムチャンネルを含む)に対する応答(Ignore, Overlap, Block)のリスト。

カスタムチャンネルの作成手順

複雑なロジックを実現するために、まずはカスタムチャンネルを作成します。ここでは「プレイヤーのシールド」と「敵の弾丸」を区別するためのチャンネルを作成する例を考えます。

ステップ1: プロジェクト設定を開く

Edit -> Project Settings を開き、Engine -> Collision セクションに移動します。

ステップ2: 新しいオブジェクトチャンネルを追加

Object Channels の項目で New Object Channel... をクリックし、以下のチャンネルを追加します。

チャンネル名デフォルト応答備考
Player_ShieldBlockプレイヤーのシールドコンポーネントに設定します。
Enemy_ProjectileIgnore敵の弾丸コンポーネントに設定します。

デフォルト応答の重要性: ここで設定するデフォルト応答は、そのチャンネルに対する応答がプロファイルで明示的に定義されていない場合 に適用されます。通常は Ignore に設定し、必要なプロファイルでのみ BlockOverlap に上書きするのがベストプラクティスです。


カスタムプロファイルの作成

次に、作成したカスタムチャンネルを活用するためのコリジョンプロファイルを作成します。

ステップ1: 新しいプリセット(プロファイル)を作成

Preset の項目で New をクリックし、以下の2つのプロファイルを作成します。

プロファイル1: Shield_Active

このプロファイルは、プレイヤーのシールドコンポーネントに適用されます。

設定項目
Preset NameShield_Active
Collision EnabledQuery and Physics
Object TypePlayer_Shield (←先ほど作成したカスタムチャンネル)

Collision Responses の設定:

チャンネル応答理由
Enemy_ProjectileBlock敵の弾丸はシールドで防ぐ。
PawnOverlapプレイヤー自身はシールドをすり抜ける。
WorldStaticIgnoreシールドは環境に影響されない。
その他Ignore必要なもの以外は無視してパフォーマンスを確保。

プロファイル2: Enemy_Bullet

このプロファイルは、敵の弾丸コンポーネントに適用されます。

設定項目
Preset NameEnemy_Bullet
Collision EnabledQuery Only (物理演算は不要な場合)
Object TypeEnemy_Projectile (←先ほど作成したカスタムチャンネル)

Collision Responses の設定:

チャンネル応答理由
Player_ShieldBlock弾丸はシールドに衝突して止まる。
PawnOverlapプレイヤー本体に当たった場合はOverlapでダメージ処理を行う。
WorldStaticBlock弾丸は壁や地面に当たる。

BlueprintとC++での適用

コリジョンプロファイルは、Static Mesh ComponentやCapsule Componentなどのコンポーネントの詳細パネルで設定できますが、ゲーム中に動的に変更することも可能です。

Blueprintでの適用

特定のイベント(例:シールド発動)でコリジョンプロファイルを切り替えるには、Set Collision Profile Name ノードを使用します。

  1. 対象のコンポーネント(例:ShieldMesh)を選択します。
  2. Set Collision Profile Name ノードを呼び出します。
  3. 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);
}

ベストプラクティスとよくある間違い

✅ ベストプラクティス

  1. チャンネルは必要最小限に抑える: カスタムチャンネルは最大18個までですが、チャンネル数が増えると応答設定の管理が複雑になり、パフォーマンスにも影響が出ます。「そのチャンネルがなければ実現できないロジックか?」 を常に自問自答しましょう。
  2. 明確な命名規則を採用する: Custom1, Custom2 のような曖昧な名前ではなく、Weapon_Laser, Destructible_Wall のように用途が明確な名前をつけましょう。
  3. プロファイルで一元管理する: アクターやコンポーネントの個別の応答設定(Custom...)を直接変更するのではなく、コリジョンプロファイル(Preset)を作成し、それを適用する ことで、設定ミスを防ぎ、管理を容易にします。

❌ よくある間違い

  1. Object Type と Trace Channel の混同:
    • 間違い: 弾丸のコンポーネントの Object TypePawn に設定し、レイキャストの Trace ChannelEnemy_Projectile に設定する。
    • 正解: 弾丸のコンポーネントの Object TypeEnemy_Projectile に設定し、レイキャストは検出したいオブジェクトのチャンネル(例:PawnWorldStatic)をトレースします。
  2. 応答設定の過剰な Block:
    • 間違い: すべてのカスタムチャンネルの応答をデフォルトで Block に設定する。
    • 結果: 意図しないオブジェクト同士が衝突し、物理挙動がおかしくなったり、パフォーマンスが低下したりします。基本は Ignore にし、必要な組み合わせでのみ Block または Overlap に設定しましょう。
  3. カスタムチャンネルの適用忘れ:
    • 間違い: プロジェクト設定でカスタムチャンネルを作成しただけで満足し、実際のアクターのコンポーネントの Object Type をデフォルトのままにしてしまう。
    • 結果: 作成したプロファイルが正しく機能しません。カスタムチャンネルを使用するコンポーネントには、必ずそのチャンネルを Object Type として設定する必要があります。

カスタムコリジョン活用のポイント

コリジョンプロファイルとカスタムコリジョンチャンネルは、Unreal Engineにおける複雑な衝突判定ロジックを整理し、効率的に実装するための強力なツールです。

要点説明
カスタムチャンネルオブジェクトの種類を細分化するための「タグ」。Object TypeTrace Channelの2種類がある。
コリジョンプロファイルチャンネル間の応答(Ignore, Overlap, Block)を定義したプリセット。設定を一元管理できる。
実装の鍵必要なチャンネルを定義し、そのチャンネルに対する応答をプロファイルとして作成し、コンポーネントに適用する。動的な変更には Set Collision Profile Name を使用する。

これらの機能を活用することで、あなたのゲームはより洗練され、デバッグしやすい衝突システムを持つことができるでしょう。