タイトル: Event ActorBeginOverlapとOn Component Begin Overlapの違い
SEOタイトル: UE5 Event ActorBeginOverlap と OnComponentBeginOverlap の違い完全ガイド(アクター単位 / コンポーネント単位 / 引数の差 / 使い分け)
| この記事の要点 |
|
2 つのイベントの違い
UE5 で「何かに重なった」ことを検知するイベントは大きく 2 種類あります。
| 項目 | Event ActorBeginOverlap | OnComponentBeginOverlap |
|---|---|---|
| 粒度 | アクター単位 | コンポーネント単位 |
| 取得元 | アクター自身のイベント | 個別のコリジョンコンポーネント |
| 付け方 | イベントグラフから直接配置 | コンポーネントを右クリック → 「イベントを追加」 |
| 引数 | OtherActor のみ | OverlappedComponent / OtherActor / OtherComp / OtherBodyIndex / bFromSweep / SweepResult |
| 呼ばれる回数(1 アクター内に複数コリジョンがある場合) | 1 回(先に重なった瞬間) | 各コンポーネントごとに発火 |
| 得意 | 「触れたら反応」の単純判定 | 体 / 頭 / 武器など部位別の判定 |
Event ActorBeginOverlap
アクター全体に対する通知です。アクター内のどれか 1 つでもコリジョンが Overlap 設定でぶつかると、1 回だけ呼ばれます(連続してぶつかっても他コンポーネントの分は呼ばれない)。
引数
| 名前 | 型 | 意味 |
|---|---|---|
| OtherActor | Actor | 重なった相手のアクター |
「誰と重なったか」しか分からないため、ヒット位置の取得や、体 / 頭の打ち分けには使えません。
OnComponentBeginOverlap
コリジョンコンポーネント自身が持つデリゲートで、そのコンポーネント単位で呼ばれます。武器メッシュの剣先だけ判定したい場合や、当たり判定ボックスを複数持つ場合に必須です。
引数
| 名前 | 型 | 意味 |
|---|---|---|
| OverlappedComponent | PrimitiveComponent | 自分側のどのコンポーネントが重なったか |
| OtherActor | Actor | 相手のアクター |
| OtherComp | PrimitiveComponent | 相手側のどのコンポーネントか |
| OtherBodyIndex | int32 | 相手の物理ボディインデックス(SkeletalMesh の部位特定) |
| bFromSweep | bool | スイープ判定経由か |
| SweepResult | HitResult | 位置 / 法線 / 距離など詳細情報 |
SweepResult.Location や SweepResult.ImpactNormal でヒット位置を取れます。OtherBodyIndex と SkeletalMesh の GetBoneName を組み合わせれば、敵のどの骨にヒットしたか(頭 / 胴体 / 脚など)も判定できます。
使い分けの目安
| シーン | 推奨 | 理由 |
|---|---|---|
| アイテムを拾う(コリジョン 1 つ) | ActorBeginOverlap | シンプルで済む |
| 武器の剣先だけ当たり判定 | OnComponentBeginOverlap | 剣身コンポーネント限定で発火 |
| 頭 / 胴体で別ダメージ | OnComponentBeginOverlap + BodyIndex | 骨ごとに判定 |
| トリガーボックスでイベント | どちらでも可 | コリジョン 1 つなら ActorBeginOverlap が短い |
| 位置 / 法線が必要 | OnComponentBeginOverlap | SweepResult から取れる |
イベント発火に必要な設定
どちらのイベントも、コリジョンが正しく設定されていないと呼ばれません。
- コリジョンコンポーネント(SphereCollision / BoxCollision / Capsule / StaticMesh など)を持つ
- Details → Collision → Generate Overlap Events = true
- Collision Preset が
OverlapAll/OverlapAllDynamic/Triggerなど、相手とOverlap判定の組合せ - 相手側も Collision Preset で対応するチャンネルが
Overlapである
どちらかが Block や Ignore だとオーバーラップイベントは発火しません。
サンプル: ActorBeginOverlap
キャラクターがアイテム(PickupActor)に触れたらメッセージを出す例。
- PickupActor の SphereCollision に
OverlapAllDynamic等を設定 - イベントグラフに Event ActorBeginOverlap を配置
- Other Actor を
Cast To MyCharacter - キャストに成功したら Print String、Destroy Actor
サンプル: OnComponentBeginOverlap
剣の剣身だけが当たり判定を持ち、ヒットした骨ごとにダメージを変える例。
- 武器アクターに SwordBladeCollision(Box)を追加
- Components パネルで右クリック → Add Event → OnComponentBeginOverlap
- SweepResult を Break HitResult → Hit Bone Name を取得
- 骨名で分岐: Head なら大ダメージ、その他なら通常ダメージ
C++ での宣言例
// ヘッダ
UPROPERTY(VisibleAnywhere) UBoxComponent* BladeCollision;
UFUNCTION()
void OnBladeBeginOverlap(
UPrimitiveComponent* OverlappedComp,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex,
bool bFromSweep,
const FHitResult& SweepResult);
// cpp の BeginPlay などでバインド
BladeCollision->OnComponentBeginOverlap.AddDynamic(
this, &AMyWeapon::OnBladeBeginOverlap);
// ActorBeginOverlap 版
UFUNCTION()
void OnMyActorBeginOverlap(AActor* OverlappedActor, AActor* OtherActor);
// BeginPlay 内
OnActorBeginOverlap.AddDynamic(this, &AMyActor::OnMyActorBeginOverlap);
よくある落とし穴
- Generate Overlap Events 切り忘れ — どちらかが false だと呼ばれない
- Collision Preset が NoCollision / Block 系 — Overlap イベントは Block では発火しない
- SkeletalMesh の物理アセット側で Overlap が無効 — キャラクター本体の Capsule とは別物
- BeginPlay より前にバインド済み — C++ で AddDynamic を Constructor に書くと、SpawnActor 直後の重なりを取りこぼす場合がある
- Begin と End がペアでない — 同時に複数コンポーネントが重なると Begin の回数 ≠ End の回数になりうる
FAQ
Q: 同じアクターに両方バインドしたら?
A: 両方発火します。役割が違うので組み合わせ自体は問題ありません。
Q: Begin と End の組はそれぞれペア?
A: はい。ActorBeginOverlap ↔ ActorEndOverlap、OnComponentBeginOverlap ↔ OnComponentEndOverlap。
Q: Tick で位置判定すれば?
A: 動きますが負荷が高く、すり抜け(高速移動で 1 フレームに通り抜け)対策にもなりません。エンジン側の Overlap / Sweep を使うのが基本です。
関連
- Tips — 親カテゴリ
- Event ActorEndOverlap / OnComponentEndOverlap
- Collision Preset / Generate Overlap Events
- HitResult / Sweep / Trace
- SkeletalMesh の物理アセット / GetBoneName