この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: キャラクターに特定のオブジェクトとの当たり判定を付ける
SEOタイトル: UE5 キャラクターに特定オブジェクトとの当たり判定を付ける完全ガイド(Collision Preset / Object Type / OnComponentBeginOverlap / Tag / Cast To / トラブル)

この記事の要点
  • UE5 の当たり判定は Collision Preset(Object Type と Channel Response)で「誰が誰と当たるか」を決める
  • 「キャラクターと特定オブジェクトだけ」を判定するなら、カスタム Object Channel を作るのが定石
  • Overlap 通知は OnComponentBeginOverlap / OnActorBeginOverlap を Blueprint または C++ でバインド
  • ヒットしたアクターが目的クラスかは Cast ToActor Tag で振り分ける
  • 「効かない」原因の大半は Generate Overlap Events 未チェック / Collision Enabled が NoCollision / Object Type 不一致

当たり判定の全体像

UE5 でアクター同士の当たり判定(Overlap / Block / Hit)は、各コンポーネントが持つCollision プロパティの組み合わせで決まります。重要なのは次の 3 つです。

項目説明
Collision Enabledそもそも当たり判定を有効にするか(NoCollision / QueryOnly / PhysicsOnly / Collision Enabled)
Object Type自分が「何者」か(Pawn / WorldStatic / WorldDynamic / カスタム)
Collision Responses相手の Object Type ごとに Ignore / Overlap / Block のいずれを返すか

手順 1: カスタム Object Channel を作る

「キャラクターと、このアイテムだけ」のように特定種類だけを反応させたい場合は、専用のチャンネルを作っておくと衝突分離が綺麗にできます。

  1. Project Settings > Collision > New Object Channel
  2. 名前: InteractiveItem、Default Response: Ignore
  3. Project Settings > Collision > Preset で新規プリセット InteractiveItemPreset を作成
    • Collision Enabled: Query Only
    • Object Type: InteractiveItem
    • Responses: Pawn = Overlap、他は Ignore

手順 2: アイテム側を設定

反応させたい対象(宝箱、扉、トリガー範囲など)の Static Mesh / Box Collision コンポーネントを開き、Collision Presets を InteractiveItemPreset に設定します。Generate Overlap Events: true を必ずチェック。

手順 3: キャラ側を設定

Character の CapsuleComponent(または検出用に追加した SphereComponent)を確認。Object Type は Pawn。Pawn のレスポンスとして InteractiveItem = Overlap を設定すれば、互いに Overlap イベントを発火させられます。

手順 4: イベントを受け取る

Blueprint なら、対象コンポーネントの OnComponentBeginOverlap(または Actor の OnActorBeginOverlap)から赤いノードを引き出してロジックを書きます。

[OnComponentBeginOverlap]
  Other Actor → Cast To BP_PlayerCharacter
    成功 →
      Print String "プレイヤーが触れた"
      DestroyActor (Self)
    失敗 → 何もしない

C++ で受け取る場合

// MyItemActor.h
UCLASS()
class MYGAME_API AMyItemActor : public AActor
{
    GENERATED_BODY()
public:
    AMyItemActor();

    UPROPERTY(VisibleAnywhere)
    USphereComponent* Trigger;

    UFUNCTION()
    void OnBeginOverlap(UPrimitiveComponent* OverlappedComp,
                        AActor* OtherActor,
                        UPrimitiveComponent* OtherComp,
                        int32 OtherBodyIndex,
                        bool bFromSweep,
                        const FHitResult& SweepResult);
};

// MyItemActor.cpp
AMyItemActor::AMyItemActor()
{
    Trigger = CreateDefaultSubobject(TEXT("Trigger"));
    RootComponent = Trigger;
    Trigger->SetSphereRadius(100.f);
    Trigger->SetCollisionProfileName(TEXT("InteractiveItemPreset"));
    Trigger->OnComponentBeginOverlap.AddDynamic(this, &AMyItemActor::OnBeginOverlap);
}

void AMyItemActor::OnBeginOverlap(UPrimitiveComponent* OverlappedComp,
                                  AActor* OtherActor, UPrimitiveComponent*,
                                  int32, bool, const FHitResult&)
{
    if (auto* Player = Cast(OtherActor))
    {
        UE_LOG(LogTemp, Log, TEXT("Player touched"));
        Destroy();
    }
}

Tag で振り分ける簡易版

クラスごとに分けるほどではなく「特定アクターだけ反応させたい」なら、Actor Tag で済むこともあります。

[OnComponentBeginOverlap]
  Other Actor → Actor Has Tag ("Coin")
    True → Add Score / Destroy Other Actor

Overlap と Block と Hit の違い

応答挙動イベント
Ignoreすり抜ける、判定なしなし
Overlapすり抜けるが通知ありOnBeginOverlap / OnEndOverlap
Blockすり抜けない(壁になる)必要なら OnHit

「効かないんですけど」原因チェックリスト

  • 双方の Generate Overlap Events がオンになっているか
  • Collision Enabled が NoCollision になっていないか
  • 双方の Responses が互いに Overlapになっているか(片方 Ignore でも発火しない)
  • Object Type を間違えていないか(Static のままになっているなど)
  • コリジョン形状(Capsule / Box / Sphere)のサイズが小さすぎないか
  • 移動が Teleport 扱いになっていないか(Sweep フラグ確認)
  • デバッグ: コンソールで show Collision、可視化で形状を確認

関連

  • Collision Preset — Project Settings > Collision
  • OnComponentBeginOverlap — Overlap イベント
  • Cast To — 型キャストノード
  • Actor Tag — 軽量振り分け
  • Tips — 親カテゴリ