본문 바로가기

TIL

2025 02 04 - 공부내용 (언리얼 충돌 감지)

오늘 내용 :

언리얼 충돌 감지하는 이벤트를 잊지 않기 위해서 

 

생각 :

게임에서 어떤 오브젝트에 닿였을 경우 특정 상호작용이 있던 경우가 존재했었습니다.

슈퍼마리오 -버섯 , 코인 등

혹은 투사체에 닿였을 경우 등 

 

이번에 공부하면서 오브젝트에 충돌하였을 시 사용할 함수를 사용하는법에 대해서 배웠습니다.

 

 

액터가 다른 액터와 충돌할 때 실행되는 이벤트를 설정할 수 있습니다. 

이를 통해 다양한 상호작용을 구현할 수 있습니다. 

충돌 감지는 주로 콜리전을 통해 이루어집니다.

 

 

 

.h 파일

 

protected:

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

 

 

cpp파일

ABaseItem::ABaseItem()
{
	// 루트 컴포넌트 생성 및 설정
	Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
	SetRootComponent(Scene);

	// 충돌 컴포넌트 생성 및 설정
	Collision = CreateDefaultSubobject<USphereComponent>(TEXT("Collision"));
	// 겹침만 감지하는 프로파일 설정
	Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
	// 루트 컴포넌트로 설정
	Collision->SetupAttachment(Scene);

	// Overlap 이벤트 바인딩
	Collision->OnComponentBeginOverlap.AddDynamic(this, &ABaseItem::OnItemOverlap);
	Collision->OnComponentEndOverlap.AddDynamic(this, &ABaseItem::OnItemEndOverlap);
}

void ABaseItem::OnItemOverlap(
	UPrimitiveComponent* OverlappedComp,
	AActor* OtherActor,
	UPrimitiveComponent* OtherComp,
	int32 OtherBodyIndex,
	bool bFromSweep,
	const FHitResult& SweepResult) 
{
	if (OtherActor && OtherActor->ActorHasTag("Player"))
	{
		Destroy();
	}
}

void ABaseItem::OnItemEndOverlap(
	UPrimitiveComponent* OverlappedComp,
	AActor* OtherActor,
	UPrimitiveComponent* OtherComp,
	int32 OtherBodyIndex) 
{

}

 

 

 

BeginOverlap은 충돌했을 때 

EndOverlap은 충돌후 벗어났을 때  호출됩니다.

 

매개변수로

Collision->OnComponentBeginOverlap.AddDynamic(this, 사용할 함수)

사용할 함수를 넣어주면 이벤트발생시 해당 함수를 사용한다 

 

여기서 이제 사용할 함수의 조건으로 매개변수가 있는데 익숙치 않은 변수들이 많았습니다.

 

BeginOverlap

 

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

 

 

EndOverlap

 

void OnItemEndOverlap(
    UPrimitiveComponent* OverlappedComp,
    AActor* OtherActor,
    UPrimitiveComponent* OtherComp,
    int32 OtherBodyIndex
);

 

 

UPrimitiveComponent* OverlappedComp : 충돌이 발생한 컴포넌트 액터의 출돌을 감지한컴포넌트 (보통은 Collision 컴포넌트)

 

AActor* OtherActor: 충돌한 다른 액터

 

UPrimitiveComponent* OtherComp : 충돌한 다른 액터의 컴포넌트 ( Collision컴포넌트)

 

나머지 매개변수들은 확인 하지는 않아서 ai에 검색해봤습니다.

 

int32 OtherBodyIndex: 충돌한 액터의 물리적 바디 인덱스를 나타냅니다. 주로 물리 시뮬레이션이 활성화된 액터에서 여러 바디가 있을 때 유용합니다.

bool bFromSweep: 이 값은 충돌이 스윕(sweep) 테스트로부터 발생했는지를 나타냅니다. 스윕 테스트는 컴포넌트가 이동하면서 충돌을 감지하는 방식입니다.

const FHitResult& SweepResult: 스윕 테스트의 결과를 담고 있는 구조체입니다. 충돌 지점의 정보(충돌 위치, 법선 벡터 등)를 포함하고 있어, 충돌에 대한 상세 정보를 얻을 수 있습니다.

 

 

 

해당방식 처럼 충돌 감지는 아니지만 특정 거리를 체크하는 Line Trace도 있으니 필요에 따라서 사용하면 될 것 같습니다.