タイトル: キャラクターに特定のオブジェクトとの当たり判定を付ける
SEOタイトル: UE5 キャラクターに特定オブジェクトとの当たり判定を付ける完全ガイド(Collision Preset / Object Type / OnComponentBeginOverlap / Tag / Cast To / トラブル)
| この記事の要点 |
|
当たり判定の全体像
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 を作る
「キャラクターと、このアイテムだけ」のように特定種類だけを反応させたい場合は、専用のチャンネルを作っておくと衝突分離が綺麗にできます。
- Project Settings > Collision > New Object Channel
- 名前:
InteractiveItem、Default Response:Ignore - 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 — 親カテゴリ