본문 바로가기

Unreal

[Unreal] 충돌, 오버랩 이벤트

 

h 파일

//#include "CoreMinimal.h" // 최소 기능만 선언
#include "EngineMinimal.h"
#include "GameFramework/Actor.h"
#include "BlockCollisionActor.generated.h"

UCLASS()
class UNREAL_COLLISIONTEST_API ABlockCollisionActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ABlockCollisionActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	virtual void NotifyHit(UPrimitiveComponent *MyComp, AActor *Other, UPrimitiveComponent *OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult &Hit) override;
	virtual void NotifyActorBeginOverlap(AActor *OtherActor) override;
	virtual void NotifyActorEndOverlap(AActor *OtherActor) override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere)
	UStaticMeshComponent *BoxMesh;
};

 

충돌 이벤트

virtual void NotifyHit(UPrimitiveComponent *MyComp, AActor *Other, UPrimitiveComponent *OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult &Hit) override;

오버랩 시작 이벤트
virtual void NotifyActorBeginOverlap(AActor *OtherActor) override;

오버랩  종료 이벤트
virtual void NotifyActorEndOverlap(AActor *OtherActor) override;

 

 

cpp 파일

#include "BlockCollisionActor.h"

// Sets default values
ABlockCollisionActor::ABlockCollisionActor()
{
 	// 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;

	BoxMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BoxMesh"));
	RootComponent = BoxMesh;
}

// Called when the game starts or when spawned
void ABlockCollisionActor::BeginPlay()
{
	Super::BeginPlay();
}

// Called every frame
void ABlockCollisionActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

AActor *tempActor;

void ABlockCollisionActor::NotifyHit(UPrimitiveComponent *MyComp, AActor *Other, UPrimitiveComponent *OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult &Hit)
{
	if (tempActor != Other)
	{
		UE_LOG(LogTemp, Warning, TEXT("NotifyHit %s"), *HitNormal.ToString());

		tempActor = Other;
	}

}

void ABlockCollisionActor::NotifyActorBeginOverlap(AActor *OtherActor)
{
	UE_LOG(LogTemp, Warning, TEXT("BeginOverlap %s"), *OtherActor->GetFullName());

}

void ABlockCollisionActor::NotifyActorEndOverlap(AActor *OtherActor)
{
	UE_LOG(LogTemp, Warning, TEXT("EndOverlap %s"), *OtherActor->GetFullName());
}

 

 

Simulate Physics 체크를 하면 피직스 테스트를 하게 되어 중력이 적용 됩니다.

Simulation Generates Hit Events 체크를 하면 충돌 이벤트 검사를 합니다.

Generate Overlap Events 체크를 하면 오버랩 이벤트 검사를 합니다.