본문 바로가기

게임 개발 공부/언리얼엔진

UE5 | C++ 개발 - 콜리전 이벤트

블루프린트에선 콜리전 이벤트 조건을 생성할 때 OnComponentBeginOverlap Event에 노드만 쭉쭉 뽑아 연결하면 되는데

c++에선 해줄 것도 많고 왠지 모르게 잘 안된다. 왜인지는 아직 해결 중이지만 오늘 하루종일 붙잡고 있던 사안이기에 적을 수 밖에 없었다. c++은 나를 잘 화나게 한다. 소질있어.

 


1. 콜리전 컴포넌트 추가

먼저 콜리전 이벤트에 사용할 컴포넌트를 추가해준다.

//헤더파일

class UBoxComponent; //전방선언

클래스 내부
{
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") // 리플렉션 시스템
    UBoxComponent* 콜리전 이름; // 콜리전 컴포넌트 선언
    
}


========================
//cpp파일

#include "Components/BoxComponent.h"

클래스::생성자()
{
	콜리전 이름 = CreateDefaultSubobject<UBoxComponent>(TEXT("콜리전 설명")); //컴포넌트 생성
    콜리전 이름->SetupAttachment(RootComponent); // 루트에 소속
}

 

 

 

 

2. 이벤트 등록

BeginPlay에 이벤트를 등록해준다.

void 클래스::BeginPlay()
{
	Super::BeginPlay();
    
    콜리전 이름->OnComponentBeginOverlap.AddDynamic(This, &클래스::실행할 함수); // 오버랩 시작 시 실행할 함수
    콜리전 이름->OnComponentEndOverlap.AddDynamic(This, &클래스::실행할 함수); //오버랩 종료 시 실행할 함수
}

#-AddDynamic

-AddDynamic이란 델리게이트(Delegate)시스템에서 특정 함수를 바인딩할 때 사용하는 매크로.

-언리얼 이벤트 시스템에서 특정 함수가 실행되도록 설정하는 역할.

-연결할 함수는 UFUNCTION()을 선언해줘야한다.

-UFUNCTION() 앞에 BlueprintCallable 또는 BlueprintNativeEvent 같은 특정 플래그가 필요.

-함수 시그니처가 이벤트 델리게이트와 일치해야한다.

-동적 델리게이트 전용이다.

--사용처

  • 컴포넌트의 이벤트( Overlap, Hit 등)에 함수를 바인딩할 때
  • 델리게이트 시스템에서 커스텀 이벤트를 사용할 때 

 

 

3. OnComponentBeginOverlap연결 함수의 매개변수

 

//함수 매개변수 목록
void 클래스::함수명(
UPrimitiveComponent* OverlappedComponent, 
AActor* OtherActor, 
UPrimitiveComponent* OtherComp, 
int32 OtherBodyIndex, 
bool bFromSweep,		 // EndOverlap에선 제외
const FHitResult& SweepResult)	 // EndOverlap에선 제외
{
}
 매개변수 설명
OverlappedComponent 충돌을 감지한 컴포넌트(현재 객체의 컴포넌트)
OtherActor 충돌한 액터
OtherComp 충돌한 액터의 컴포넌트
OtherBodyIndex 충돌한 바디 인덱스(멀티 콜리전 지원)
bFromSweep 스윕테스트로 감지되었는지 여부
SweepResult 충돌 정보(위치, 충돌 노멀 등)

#-멀티 콜리전 : 한번에 여러 충돌이 발생하거나 범위에 들어온 여러 객체의 정보를 불러들이거나 할때 한번에 다량의 충돌을 배열로 가져오는 것. ( 다반사형 무기, 광범위형 무기, 적 감지 등) 

 

 

열심히 찾아봐도 이정도가 기본 틀인데, 그리 복잡하지도 않은 구조에서 이것저것 만져봐도 잘 해결되지 않는다.

더 열심히 찾아봐야겠다.