언리얼 엔진에선 두 가지의 충돌체가 존재한다. 하나는 메쉬(static 또는 skeletal)의 충돌체 그리고 충돌 컴포넌트(SphereComponent,BoxComponent 기타 등등).
C++로 충돌체 이벤트 바인딩할 수 있는 방법 총 두가지가 있다.
오버라이딩 방법
- Hit 이벤트를 사용하려면 Simulation Generates Hit Events가 체크 되어있어야 한다.
- Overlap 이벤트를 사용하려면 Generate Overlap Events가 체크 되어있어야 한다.
- 항상 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 |
동적 바인딩 방법
- 무조건 BeginPlay 즉 플레이버튼 누른 직후 바인딩이 되어야하고(월드가 생성되기 때문) UFUNCTION() 매크로를 사용해야 한다.
- 함수명 아무렇게나 줄 수 있으며, 위에 Collision에 체크가 해제 되어 있더래도 무조건 씹히고 동적바인딩된 함수가 호출된다, 예) Hit 이벤트를 동적바인딩 했고 Collision 안에 체크해제를 했더라도 무조건 실행된다.
함수 선언하고 바인딩을 해보았는데 에러가 난다. (인자값으로 위의 UserObject 즉 소유권있는 오브젝트이므로 this, FuncName 클래스 멤버 함수 포인터 주소, 바인딩할 함수의 주소를 보내준다)
에러가 나서 해당 변수들을 확인해보니 구조체 변수인걸 확인해볼 수가 있다.
저 위에 있는 변수들의 구조체 정체를 확인하기 위해 타고 들어가봤더니 눈에 낯익은게 보인다.
조금 더 타고 들어가서 확인해보니 해당 구조체 명칭은 SparseDelegateClass의 인자가 되겠고, OwningClass의 인자는 UPrimitiveComponent 즉 모든 충돌체의 부모 클래스가 되겠고, 마지막으로 DelegateName 즉 바인딩할 함수포인터의 명칭이다 OnComponentHit, OnComponentBeginOverlap 그리고 OnComponentEndOverlap.
자 그러면 분석은 끝났으니 돌아와서 첫 3개의 인자를 제외한 나머지를 파라미터로 추가해주도록 한다.
에러없이 원할하게 바인딩이 된 모습을 볼 수가 있다.
'게임엔진 > Unreal' 카테고리의 다른 글
[Unreal] 컴포넌트 부착 함수와 방법 (0) | 2022.07.06 |
---|---|
[Unreal] 매터리얼 검정색 뒷배경 제거하는 방법 (0) | 2022.07.05 |
[Unreal] 차량 설정 방법 (Chaos Vehicle) (0) | 2022.05.30 |
[Unreal] 인스턴스와 서브시스템 (Instance/SubSystem) 갖고오는 방법 (0) | 2022.05.28 |
[Unreal] 충돌 관련 함수 (0) | 2022.05.27 |