UE4: C++ クラスで実装したアクターのコンポーネントの OnComponentBeginOverlap.AddDynamic 等がうまく動作しない時に確認すること
「C++ でアクターを実装し、 StaticMeshComponent
のオーバーラップイベントを受けたい、と思ったがなぜか StaticMeshComponent
に OnComponentBeginOverlap.AddDynamic
した this
の TriggerEnter
が呼ばれない。」
そんな時には UFUNCTION
が TriggerEnter
等についているか確認するとあっさり問題が解決するかもしれません。
// my_actor.h public: // ↓ この UFUNCTION() をうっかり定義し忘れると期待動作しない。 UFUNCTION() void TriggerEnter(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);
他には、より単純に bGenerateOverlapEvents
や SetCollisionProfileName
に適切な値を放り込んでいない場合もありますが、これはうっかりという事も少ないとは思います。コード備忘録も兼ねて一応紹介。
// 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; } }