1. On Component Begin/End Overlap
SphereCollisionComponent는 USphereComponent이다
USphereComponent* Sphere;
USphereComponent는 UPrimitiveComponent를 상속받고 UPrimitiveComponent에는 OnComponentBegin/EndOverlap Delegate가 존재한다
따라서 USphereComponent뿐 아니라 UPrimitiveComponent를 상속받는 모든 Component는 OnComponentBegin/EndOverlap Delegate를 사용할 수 있다
OnComponentBeginOverlap은 Component가 다른 Actor/Component와 Overlap이 시작했을 때 발생하는 Event이고
OnComponentEndOverlap은 Component가 다른 Actor/Component와 Overlap이 끝났을 때 발생하는 Event이다
DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SixParams( FComponentBeginOverlapSignature, UPrimitiveComponent, OnComponentBeginOverlap, UPrimitiveComponent*, OverlappedComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex, bool, bFromSweep, const FHitResult &, SweepResult);
DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams( FComponentEndOverlapSignature, UPrimitiveComponent, OnComponentEndOverlap, UPrimitiveComponent*, OverlappedComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex);
이러한 엔진 코드들은 Solution Explorer에서 직접 타고 들어가 찾아서 사용하면 된다 (위 코드는 UPrimitiveComponent.h)
해당 Delegate에 Bind할 Callback함수는 매개변수를 동일하게 맞춰주어야 한다
//Bind할 CallBack함수
UFUNCTION()
void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
이때 HitResult를 const &타입으로 넘겨주는데 참조 타입을 매개변수에 전달하면 원본값 변경의 위험이 있기 때문에 const로 넘기는 것이고 참조 타입으로 넘겨 사본 생성을 방지하는 것이다 (struct와 같이 큰 값인데 원본값을 변경하지 않아야 한다면 함수의 매개변수로 const &로 넘기는것이 좋다)
OnComponentBeginOverlap Delegate의 매개변수는 순서대로 다음과 같다
UPrimitiveComponent* OverlappedComponent : Overlap된 본인의 Component
AActor* OtherActor : Overlap된 상대 Actor
UPrimitiveComponent* OtherComp : Overlap된 상대 Component
int32 OtherBodyIndex : 충돌한 상대의 PhysicsBody가 어떤 Physics Body인지 나타내는 int32값
bool bFromSweep : Sweep했는지? bool값
const FHitResult& SweepResult : Overlap된 위치와 같은 정보를 담고 있는 Struct
OnComponentEndOverlap Delegate의 매개변수는 다음과 같다 (각 매개변수의 의미는 BeginOverlap과 동일하다)
UPrimitiveComponent* OverlappedComponent
AActor* OtherActor
UPrimitiveComponent OtherComp
int32 OtherBodyIndex
//Bind
Sphere->OnComponentBeginOverlap.AddDynamic(this, &AItems::OnSphereOverlap);
//&클래스명::함수로 정규화된 함수의 주소를 넘긴다
void AItems::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
//Test
const FString OtherActorName = OtherActor->GetName();
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(1, 30.f, FColor::Black, OtherActorName);
}
}
(OnComponentEndOverlap도 같은 방식으로 처리한다)
GetName() : UObject의 Name을 FString으로 return한다
'Unreal' 카테고리의 다른 글
23. Attach & Pick, Enum State, Switching Animation (81) | 2024.02.22 |
---|---|
22. IK Rig And Retarget & Socket & fbx Import (70) | 2024.02.15 |
20. Observer Pattern & Delegate (80) | 2024.02.07 |
19. Collision & Overlap (1) (117) | 2024.01.31 |
18. IK (Inverse Kinematics) (109) | 2024.01.27 |