오늘 내용 :
언리얼 충돌 감지하는 이벤트를 잊지 않기 위해서
생각 :
게임에서 어떤 오브젝트에 닿였을 경우 특정 상호작용이 있던 경우가 존재했었습니다.
슈퍼마리오 -버섯 , 코인 등
혹은 투사체에 닿였을 경우 등
이번에 공부하면서 오브젝트에 충돌하였을 시 사용할 함수를 사용하는법에 대해서 배웠습니다.
액터가 다른 액터와 충돌할 때 실행되는 이벤트를 설정할 수 있습니다.
이를 통해 다양한 상호작용을 구현할 수 있습니다.
충돌 감지는 주로 콜리전을 통해 이루어집니다.
.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도 있으니 필요에 따라서 사용하면 될 것 같습니다.
'TIL' 카테고리의 다른 글
2025 - 02 - 06 기록 (0) | 2025.02.06 |
---|---|
2025- 02- 05 공부 벡터에서 정규화를 사용하는 이유 (0) | 2025.02.05 |
2025 - 02 - 03 Unreal Input MappingContext 우선순위 (1) | 2025.02.03 |
2025 - 01- 31 언리얼 에서 객채 움직이기 (c++) (0) | 2025.01.31 |
2025 - 01 - 24 재귀 함수와 반복문 다시 이해 (0) | 2025.01.24 |