【Unreal C++】②Overlapイベント【UE4】
今回はOverlapイベントについて書いていこうと思います。
分かりやすいようにTriggerBoxを作成し、そこに何かがオーバラップ(接触)したという例を示したいと思います。
docs.unrealengine.com
TriggerBoxの作成
TriggerBoxを親クラスにするとうまくいかなかったのでActorを親クラスにしてBoxコンポーネントを追加しました。
(TriggerBoxを親クラスにした場合のやり方を知ってる方は教えていただけると幸いです。)
hoge.h
#include "CoreMinimal.h" #include "Components/BoxComponent.h"//UBoxComponent #include "hoge.generated.h" UCLASS() class HOGEPROJECT_API hoge : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties hoge(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; UPROPERTY() USceneComponent* Scene; UPROPERTY(EditAnywhere, BlueprintReadWrite) UBoxComponent* BoxComp; public: // Called every frame virtual void Tick(float DeltaTime) override; };
UBoxComponentを使用するにはBoxComponent.hをインクルードする必要があります。
ヘッダファイルの場所は(エンジンをインストールしたフォルダ)/Engine/Source/Runtime/Engine/Classes/Components/BoxComponent.hです。
.cpp
#include "hoge.h" //Set default values hoge::hoge() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene")); RootComponent = Scene; BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("CollisionComp")); BoxComp->SetupAttachment(RootComponent); }
Overlapイベント
OnComponentBeginOverlap
このイベントは対象のコンポーネントに何かがOverlap(接触する)と実行されます。
BPでは↓のようなノードです。
hoge.h
//OnComponentBeginOverlap UFUNCTION() void OnOverlapBegin(UPrimitiveComponent* OverlappedComponent,AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult);
OnOverlapBegin関数を追加し、Overlapした際に実行したいイベントを書いていきます。
ちなみにUFUNCTION()がないとクラッシュします。
hoge.cpp
hoge::hoge() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene")); RootComponent = Scene; BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("CollisionComp")); BoxComp->SetupAttachment(RootComponent); //↓追加 BoxComp->OnComponentBeginOverlap.AddDynamic(this, &Ahoge::OnOverlapBegin); } void Ahoge::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent,AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult) { //Overlapした際に実行したいイベント }
AddDynamicによってOnComponentBeginOverlapと呼びたい関数をバインディングします。
これによってOverlapするとOnOverlapBeginが呼ばれます。
OnComponentEndOverlap
このイベントは対象のコンポーネントへのOverlapが終了すると実行されます。
BPでは↓のようなノードです。
基本的にはOnComponentBeginOverlapと実装方法は同じだと思います。
Overlapした際に実行したいイベントを書く関数の引数を次のように変更します。
OnComponentOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
OnActorBeginOverlap
このイベントは対象のActorに何かがOverlapすると実行されます。
BPでは↓のようなノードです。
基本的にはOnComponentBeginOverlapと実装方法は同じだと思います。
Overlapした際に実行したいイベントを書く関数の引数を次のように変更します。
OnActorOverlapBegin(AActor* OverlappedActor, AActor* OtherActor);
OnActorEndOverlap
このイベントは対象のActorへのOverlapが終了すると実行されます。
BPでは↓のようなノードです。
基本的にはOnComponentBeginOverlapと実装方法は同じだと思います。
Overlapした際に実行したいイベントを書く関数の引数を次のように変更します。
OnActorOverlapEnd(AActor* OverlappedActor, AActor* OtherActor);