C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4: C++ クラスで実装したアクターのコンポーネントの OnComponentBeginOverlap.AddDynamic 等がうまく動作しない時に確認すること

C++ でアクターを実装し、 StaticMeshComponent のオーバーラップイベントを受けたい、と思ったがなぜか StaticMeshComponentOnComponentBeginOverlap.AddDynamic した thisTriggerEnter が呼ばれない。」

そんな時には UFUNCTIONTriggerEnter 等についているか確認するとあっさり問題が解決するかもしれません。

// my_actor.h
public:
  // ↓ この UFUNCTION() をうっかり定義し忘れると期待動作しない。
  UFUNCTION()
  void TriggerEnter(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);

他には、より単純に bGenerateOverlapEventsSetCollisionProfileName に適切な値を放り込んでいない場合もありますが、これはうっかりという事も少ないとは思います。コード備忘録も兼ねて一応紹介。

// my_actor.cpp

AMyActor::AMyActor()
{
  auto mesh_component = CreateDefaultSubobject< UStaticMeshComponent >( TEXT( "SomethingMesh" ) );
  if ( mesh_component )
  {
    // オーバーラップさせたいのにオーバーラップしないプロファイルではもちろん期待動作しない。
    mesh_component->SetCollisionProfileName( TEXT( "OverlapAllDynamic" ) );
    // オーバーラップイベントが欲しいのにイベント発生フラグをONにしていなければもちろん期待動作しない。
    mesh_component->bGenerateOverlapEvents = true;
    // 宣言にUFUNCTIONが付いている事を確認しつつオーバーラップイベントにファンクター(UE的にはデリゲート)を放り込む。
    mesh_component->OnComponentBeginOverlap.AddDynamic( this, &AMyActor::TriggerEnter );
    
    RootComponent = mesh_component;
  }
}

参考

  1. OnComponentBeginOverlap | Unreal Engine API Reference
  2. bGenerateOverlapEvents | Unreal Engine API Reference
  3. UPrimitiveComponent::SetCollisionProfileName | Unreal Engine API Reference