본문 바로가기
Unreal/Manual

Unreal C++ Actor의 충돌 구현 Actor BeginOverlap

by Dev_카페인 2023. 11. 2.
반응형

[Unreal/C++] Actor의 충돌 구현 Actor BeginOverlap

 

Actor로부터 상속받은 클래스는 ActorBeginOverlap 이벤트를 가지고 있다.


항상 델리게이트나 이벤트의 함수명은 On으로 시작한다.

 

충돌하려는 각 액터에 충돌체가 최소 하나 이상 존재해야하고
해당 충돌체는 GenerateOverlap 이벤트가 켜져 있어야 충돌 검사가 가능하다.
GenerateOverlap 이벤트는 에디터 디테일 패널의 Collision 안에 있다.

 

OnActorBeginOverlap과 OnActorEndOverlap은 다이나믹 델리게이트로 구성되어 있다.

OnActorBeginOverlap에서 F12를 눌러 타고 들어가면 Actor.h에 다음과 같이 구현되어 있다.

일반 델리게이트는 파라미터의 순서와 타입이 일치하면 되지만

다이나믹 델리게이트는 파라미터의 순서와 타입 그리고 이름까지 모두 일치해야 한다. 

OnActorBeginOverlap.AddDynamic을 구현하려는 경우 TwoParams 로 되어 있는데,

FActorBeginOverlapSignature의 위임 클래스를 가지고 있고

AActor가 소유하고 있으며

OnActorBeginOverlap이라는 이름을 가지고 있다.

OverlappedActor와 OtherActor 두 개의 파라미터를 가지고 있는데

복사해서 사용할 경우 AActor*뒤에 있는 쉼표를 조심해야 한다.

파라미터들은 복사해서 콤마 제거 후 사용하는 것이 좋다.

 

 

다이나믹 멀티 캐스트 델리게이트로 구현되어 있어서 연결되는 함수를 여럿 정의할 수 있다.

추가하는 방법은 보통 BeginPlay에서 연결시켜준다.

델리게이션에 의해서 콜 된 함수는 반드시 UFUNCTION() 매크로를 붙여줘야한다.
UFUNCTION()은 에디터나 블루프린트와 통신할 수 있는 함수라는 뜻이다.

.h

 

.cpp

 

.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Global.h"
#include "Components/BoxComponent.h"
#include "Components/TextRenderComponent.h"
#include "C01_ActorBeginOverlap.generated.h"

UCLASS()
class UONLINE_CPP_API AC01_ActorBeginOverlap : public AActor
{
	GENERATED_BODY()
	
private :
	UPROPERTY(VisibleDefaultsOnly)
	class USceneComponent* Scene;

	UPROPERTY(VisibleDefaultsOnly)
	class UBoxComponent* Box;

	UPROPERTY(VisibleDefaultsOnly)
	class UTextRenderComponent* Text;

public:	
	AC01_ActorBeginOverlap();

protected:
	virtual void BeginPlay() override;

private :
	UFUNCTION()
	void ActorBeginOverlap(AActor* OverlappedActor, AActor* OtherActor);
	UFUNCTION()
	void ActorEndOverlap(AActor* OverlappedActor, AActor* OtherActor);
};

 

.cpp
#include "03_Collision/C01_ActorBeginOverlap.h"

AC01_ActorBeginOverlap::AC01_ActorBeginOverlap()
{
	CHelpers::CreateComponent<USceneComponent>(this, &Scene, "Scene");
	CHelpers::CreateComponent<UBoxComponent>(this, &Box, "Box", Scene);
	CHelpers::CreateComponent<UTextRenderComponent>(this, &Text, "Text", Scene);

	Box->SetRelativeScale3D(FVector(3));
	Box->bHiddenInGame = false;

	Text->SetRelativeLocation(FVector(0, 0, 100));
	Text->SetRelativeRotation(FRotator(0, 180, 0));
	Text->SetRelativeScale3D(FVector(2));
	Text->TextRenderColor = FColor::Red;
	Text->HorizontalAlignment = EHorizTextAligment::EHTA_Center;
	Text->Text = FText::FromString(GetName());


}

void AC01_ActorBeginOverlap::BeginPlay()
{
	Super::BeginPlay();
	
	OnActorBeginOverlap.AddDynamic(this, &AC01_ActorBeginOverlap::ActorBeginOverlap);
	OnActorEndOverlap.AddDynamic(this, &AC01_ActorBeginOverlap::ActorEndOverlap);
}

void AC01_ActorBeginOverlap::ActorBeginOverlap(AActor* OverlappedActor, AActor* OtherActor)
{
	FString str = "";
	str.Append("C++ Actor Begin Overlap");
	str.Append(OtherActor->GetName());
	CLog::Log(str);
}

void AC01_ActorBeginOverlap::ActorEndOverlap(AActor* OverlappedActor, AActor* OtherActor)
{
	FString str = "";
	str.Append("C++ Actor End Overlap");
	str.Append(OtherActor->GetName());
	CLog::Log(str);
}

 

 

 

반응형