게임엔진/Unreal

[Unreal] 언리얼 충돌체 관련 함수와 이벤트(델리게이트) 바인딩 방법 #2

ShovelingLife 2022. 6. 2. 12:05

언리얼 엔진에선 두 가지의 충돌체가 존재한다. 하나는 메쉬(static 또는 skeletal)의 충돌체 그리고 충돌 컴포넌트(SphereComponent,BoxComponent 기타 등등).

C++로 충돌체 이벤트 바인딩할 수 있는 방법 총 두가지가 있다.

오버라이딩 방법

  1. Hit 이벤트를 사용하려면 Simulation Generates Hit Events가 체크 되어있어야 한다.
  2. Overlap 이벤트를 사용하려면 Generate Overlap Events가 체크 되어있어야 한다.
  3. 항상 Super:: 부모클래스의 해당 함수를 호출 하여야한다. 예) NotifyHit 함수를 오버라이딩 했다, Super::NotifyHit();

NotifyHit (오브젝트로부터 충돌했다)  예시) virtual void NotifyHit() override;

 

1
2
3
4
5
6
7
8
9
10
11
virtual void NotifyHit
(
    class UPrimitiveComponent * MyComp,
    AActor * Other,
    class UPrimitiveComponent * OtherComp,
    bool bSelfMoved,
    FVector HitLocation,
    FVector HitNormal,
    FVector NormalImpulse,
    const FHitResult & Hit
)
cs

Overlap(A오브젝트랑 B오브젝트가 중첩됐다) Begin(시작), End(끝남)  예시) virtual void NotifyActorBeginOverlap() override;

 

1
2
3
4
5
6
7
8
9
virtual void NotifyActorBeginOverlap
(
    AActor * OtherActor
)
 
virtual void NotifyActorEndOverlap
(
    AActor * OtherActor
)
cs

동적 바인딩 방법

  1. 무조건 BeginPlay 즉 플레이버튼 누른 직후 바인딩이 되어야하고(월드가 생성되기 때문) UFUNCTION() 매크로를 사용해야 한다.
  2. 함수명 아무렇게나 줄 수 있으며, 위에 Collision에 체크가 해제 되어 있더래도 무조건 씹히고 동적바인딩된 함수가 호출된다, 예) Hit 이벤트를 동적바인딩 했고 Collision 안에 체크해제를 했더라도 무조건 실행된다. 

함수 선언하고 바인딩을 해보았는데 에러가 난다. (인자값으로 위의 UserObject 즉 소유권있는 오브젝트이므로 this, FuncName 클래스 멤버 함수 포인터 주소, 바인딩할 함수의 주소를 보내준다)

파라미터 0개 함수
에러나는 모습

에러가 나서 해당 변수들을 확인해보니 구조체 변수인걸 확인해볼 수가 있다.

저 위에 있는 변수들의 구조체 정체를 확인하기 위해 타고 들어가봤더니 눈에 낯익은게 보인다.

조금 더 타고 들어가서 확인해보니 해당 구조체 명칭은 SparseDelegateClass의 인자가 되겠고, OwningClass의 인자는 UPrimitiveComponent 즉 모든 충돌체의 부모 클래스가 되겠고, 마지막으로 DelegateName 즉 바인딩할 함수포인터의 명칭이다 OnComponentHit, OnComponentBeginOverlap 그리고 OnComponentEndOverlap.

자 그러면 분석은 끝났으니 돌아와서 첫 3개의 인자를 제외한 나머지를 파라미터로 추가해주도록 한다.

에러없이 원할하게 바인딩이 된 모습을 볼 수가 있다.