Unreal

21. Collision & Overlap (2)

Kelvin의 게임개발 2024. 2. 8. 00:32
728x90
반응형

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한다

 

 

 

728x90
반응형

'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