How do I override UFUNCTIO() functions

limbusdev
Mon, 13 May 2019 19:51:49 +0000
Community & Industry Discussion

Hi there,
I created a generic ASimpleTriggerVolume and another more concrete ASimpleBoxTriggerVolume which overrides some functions. Unfortunately Unreal Editor instantly crashes when trying to start it with this implementation:

SimpleTriggerVolume.h:

UCLASS()
class BEATEMDOWN_API ASimpleTriggerVolume : public AActor
{
	GENERATED_BODY()

public:

	ASimpleTriggerVolume();


protected:

	UPROPERTY(VisibleAnywhere, Category = "Setup")
	UShapeComponent* Shape = nullptr;

	virtual void BeginPlay() override;

public:

	virtual void Tick(float DeltaTime) override;

protected:

	UFUNCTION()
	virtual void OnTriggerOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

	UFUNCTION()
	virtual void OnTriggerOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);

	UFUNCTION()
	virtual void SetupShapeComponent();

	UFUNCTION()
	virtual void BindTriggerCallbacksToShape();

};

and SimpleTriggerVolume.cpp:

ASimpleTriggerVolume::ASimpleTriggerVolume()
{
	PrimaryActorTick.bCanEverTick = true;

	SetupShapeComponent();
	BindTriggerCallbacksToShape();
}

void ASimpleTriggerVolume::BeginPlay()           { Super::BeginPlay(); }

void ASimpleTriggerVolume::Tick(float DeltaTime) { Super::Tick(DeltaTime); }


void ASimpleTriggerVolume::SetupShapeComponent()
{
	auto BoxTrigger = CreateDefaultSubobject<UBoxComponent>(FName("Trigger Shape"));
	BoxTrigger->SetBoxExtent(FVector(50.f, 50.f, 50.f));
	BoxTrigger->SetGenerateOverlapEvents(true);
	Shape = BoxTrigger;
}

void ASimpleTriggerVolume::BindTriggerCallbacksToShape()
{
	if (Shape)
	{
		Shape->OnComponentBeginOverlap.AddDynamic(this, &ASimpleTriggerVolume::OnTriggerOverlapBegin);
		Shape->OnComponentEndOverlap.AddDynamic(this, &ASimpleTriggerVolume::OnTriggerOverlapEnd);
	}
}


void ASimpleTriggerVolume::OnTriggerOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	UE_LOG(LogTemp, Warning, TEXT("SimpleTriggerVolume::OnTriggerOverlapBegin()"));
}

void ASimpleTriggerVolume::OnTriggerOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
	UE_LOG(LogTemp, Warning, TEXT("SimpleTriggerVolume::OnTriggerOverlapEnd()"));
}

With only this script, everyhing works fine. As soon as I inherit from it and override the UFUNCTION SetupShapeComponent Unreal crashes, even before I can hit play.

SimpleBoxTriggerVolume.h:

UCLASS()
class BEATEMDOWN_API ASimpleBoxTriggerVolume : public ASimpleTriggerVolume
{
	GENERATED_BODY()

public:

	UPROPERTY(EditAnywhere, Category = "Geometry")
	FVector TriggerExtent = FVector(50.f, 50.f, 50.f);

	ASimpleBoxTriggerVolume();

	virtual void BeginPlay() override;

	virtual void Tick(float DeltaTime) override;


protected:
///////////////////////////////////////////////////////////////////////////////
//// ASimpleTriggerVolume

	virtual void SetupShapeComponent() override;
};

and SimpleBoxTriggerVolume.cpp:

ASimpleBoxTriggerVolume::ASimpleBoxTriggerVolume()
{
	PrimaryActorTick.bCanEverTick = true;

	RootComponent = CreateDefaultSubobject<USceneComponent>(FName("Root Component"));

        SetupShapeComponent();
	BindTriggerCallbacksToShape();

}

void ASimpleBoxTriggerVolume::BeginPlay(){Super::BeginPlay();}

void ASimpleBoxTriggerVolume::Tick(float DeltaTime){Super::Tick(DeltaTime);}


void ASimpleBoxTriggerVolume::SetupShapeComponent()
{
	auto BoxTrigger = CreateDefaultSubobject<UBoxComponent>(FName("Trigger Shape"));
	BoxTrigger->SetBoxExtent(TriggerExtent);
	BoxTrigger->SetGenerateOverlapEvents(true);
	Shape = BoxTrigger;
}

1 post - 1 participant