언리얼 엔진 5/공부

[언리얼 엔진 5] 언리얼 엔진에서의 OnTriggerEnter (OnComponentBeginOverlap)

ciel45 2023. 12. 17. 23:45

유니티로 게임을 개발해본 사람은, OnTriggerEnter 혹은 OnCollisionEnter를 사용하여 무언가 이벤트가 발생하도록 해본 경우가 많을 것이다.

 

 

 

언리얼 엔진에서는 비슷한 것으로 OnComponentBeginOverlap 델리게이트가 있다.

여기서 Component는 Box/Capsule/Sphere Collision이 될 수 있겠다.

 

 

 

델리게이트라는 단어가 생소하다면, 이벤트라고 이해하면 된다.

https://docs.unrealengine.com/5.3/ko/delegates-and-lamba-functions-in-unreal-engine/

 

델리게이트

C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형입니다.

docs.unrealengine.com

UnityEvent를 사용해봤다면 이해가 쉬울 것이다. 리스너 함수를 줄줄이 달아놓고 뻥뻥 터뜨리는 것과 같다.

 

 

 

OnComponentBeginOverlap도 델리게이트로, 그 사용법은 다음과 같다.

  • 상황에 맞는 콜백 함수를 만든다.
  • (해당 상황 델리게이트).AddDynamic(Arg1, Arg2)으로 리스너를 달아준다.
    • Arg1: 콜백 함수가 있는 객체의 주소
    • Arg2: 콜백 함수의 주소 (함수 포인터)

아래는 사용 예시이다.

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

	Sphere->OnComponentBeginOverlap.AddDynamic(this, &AItem::OnSphereOverlap);
	Sphere->OnComponentEndOverlap.AddDynamic(this, &AItem::OnSphereOverlapEnd);
}


void AItem::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	AKannaCharacter* KannaCharacter = Cast<AKannaCharacter>(OtherActor);
	if (KannaCharacter)
	{
		KannaCharacter->SetOverlappingItem(this);
	}
}

void AItem::OnSphereOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
	AKannaCharacter* KannaCharacter = Cast<AKannaCharacter>(OtherActor);
	if (KannaCharacter)
	{
		KannaCharacter->SetOverlappingItem(nullptr);
	}
}

USphereComponent* Sphere(구형 콜라이더 포인터)의 BeginOverlap, EndOverlap에 적절한 함수를 바인딩해주었다.

 

해당 코드에 따르면, 아이템의 Component인 구체 콜라이더에 캐릭터가 들어올 시 OverlappingItem을 자기 자신으로 설정하고, 콜라이더에서 캐릭터가 나갈 시에는 OverlappingItem을 다시 널 포인터로 설정해준다.

 

 

유니티에서 OnTriggerEnter(), OnCollisionEnter() 내부에 직접 코드를 짰던 것과는 조금 다르다. (바인딩 필요)

 

 

언리얼 쪽이 조금 더 복잡하지만, 여러개의 콜라이더에 따로따로 원하는 바인딩을 해줄 수 있기 때문에 유연성이 더 뛰어나다.