[C++] 충돌 이벤트

Woogle·2022년 11월 3일
0

언리얼 엔진 5

목록 보기
19/63
post-thumbnail
  • 적이 플레이어와 충돌 시 서로 파괴하는 함수를 만드는 방법은 두가지가 있다.
  1. Override: Actor가 충돌 시 호출되는 함수를 재정의(Override)하여 파괴하는 방법
  2. Delegate Binding: Actor의 Component가 충돌 시 호출할 함수를 바인딩(Binding)해놓고 해당 함수에서 파괴하는 방법
  • 두가지 방법을 모두 C++로 구현해본다.

※ 이상의 BP와 이하의 C++의 작동 방식은 차이가 크니 메커니즘 참고용으로만 사용할 것


📄 Actor Begin Overlap

  • Override: Actor가 충돌 시 호출되는 NotifyActorBeginOverlap 함수를 재정의(override)

✏️ 헤더

// 재정의(Override)할 함수
virtual void NotifyActorBeginOverlap(AActor* OtherActor) override;

✏️ 소스

void AEnemy::NotifyActorBeginOverlap(AActor* OtherActor)
{
	APlayerPawn* playerRef = Cast<APlayerPawn>(OtherActor);
	if (playerRef)	// 형변환 실패 시 실행 안됨 (nullptr)
	{
		OtherActor->Destroy();
		this->Destroy();
	}
}

📄 On Component Begin Overlap

  • Delegate Binding: Actor의 Component가 충돌 시 호출할 함수를 연결(Binding)해놓고 충돌 시 호출

✏️ 헤더

// 바인딩(Binding)할 함수. 이름 바꿔도 됨
UFUNCTION()	// 델리게이트 함수는 지정자 필수
void OnMyComponentBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

✏️ 소스

// 델리게이트 바인딩 (보통 Begin Play에서 함)
boxComp->OnComponentBeginOverlap.AddDynamic(this, &AEnemy::OnMyComponentBeginOverlap);

// 함수 몸체
void AEnemy::OnMyComponentBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if (OtherActor->IsA(APlayerPawn::StaticClass()))	// IsA()는 형변환 성공 여부를 bool로 반환함
	{
		OtherActor->Destroy();
		this->Destroy();
	}
}

참고자료

profile
노력하는 게임 개발자

0개의 댓글