[UE5] Hit, Damage

kkado·2024년 4월 6일
1

UE5

목록 보기
32/63
post-thumbnail

게임 상에서 Hit event는 매우 자주 사용된다. 총알 등의 발사체를 발사해서 물체에 데미지를 입히거나, 또는 충돌을 감지해서 특정한 기능을 수행하게 할 수 있다.

Hit Event?

StaticMeshComponent의 상위 클래스인 PrimitiveComponent 에는 hit event을 발생시킬 수 있다. 이것으로 부딪힌 액터, 컴포넌트, 그리고 HitResult를 얻을 수 있다. 이 hit event를 OnComponentHit 이라고 한다.

OnComponentHit은 'Multicast Delegate' 라고도 한다. 이 이벤트에는 여러 개의 함수를 바인딩할 수 있다. 이 함수는 Invocation List에 등록되며, 이벤트가 발생하면 리스트에 있는 모든 함수에 이벤트가 발생했다고 Broadcast 한다.

함수 바인딩 및 이벤트 발생

OnComponent 내의 AddDynamic 함수를 이용해 함수를 바인딩할 수 있다.

이 함수는 user object, 이벤트가 발생할 함수 총 2개의 인자를 필요로 한다.

ProjectileMesh->OnComponentHit.AddDynamic(this, &AProjectile::OnHit);

이런 식으로 사용할 수 있다. 그리고 OnHit 함수는 파라미터가 정해져 있다.

void AProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
	UE_LOG(LogTemp, Warning, TEXT("HitComp : %s"), *HitComp->GetName());
	UE_LOG(LogTemp, Warning, TEXT("OtherActor : %s"), *OtherActor->GetName());
	UE_LOG(LogTemp, Warning, TEXT("OtherComp : %s"), *OtherComp->GetName());
}

위와 같은 인자를 받고 있다. 이것들의 이름을 출력해 보면서 각기 어떤 것들을 가리키는지 확인할 수 있다. 또한 이 함수는 헤더 파일에서 UFUNCTION() 으로 선언해 주어야 함에 유의한다.

HitComp에는 충돌을 일으킨 컴포넌트, 그리고 Other 에는 충돌한 액터, 컴포넌트가 담겨 있다.


Damage

Health Component의 필요성에 대해

탱크 혹은 타워 클래스의 상위 클래스인 BasePawn 클래스에서 데미지를 다루는 로직을 작성해도 괜찮겠지만 구조물 등과 같이 폰이 아닌 액터에서도 데미지 로직이 필요할 수 있다. 따라서 데미지 로직만을 다루는 컴포넌트를 만들어 이를 컴포지션하여 사용하는 형태가 보다 효율적일 것이다.

만약 이 액터가 체력 개념과 데미지를 받는 로직이 필요하다면 이 Health Component를 부착하여 사용할 수 있다.

그리고 이 컴포넌트는 Rotation, Location 등의 기능이 필요없고 화면에도 보일 일이 없기 때문에 SceneComponent 보다는 ActorComponent에서 상속하는 것이 합리적으로 보인다.

위 그림과 같이 Health Component를 생성했고 이를 Tank 블루프린트에 부착하여 탱크에 체력 개념을 채용할 수 있다.


액터의 체력과 데미지 시스템은 충돌 이벤트와 함께 자주 사용된다. 언리얼 엔진에는 자체적으로 데미지를 관리할 수 있는 Delegate가 존재한다.

OnComponentHit 처럼, 액터에는 OnTakeAnyDamage 라는 이벤트를 발생시킬 수 있으며, 마찬가지로 리스트에 함수를 바인딩할 수 있는 형태이다.

void UHealthComponent::DamageTaken(AActor* DamagedActor, float Damage, const UDamageType* DamageType, class AController* Instigator, AActor* DamageCauser);

콜백 함수의 인자 형태는 위와 같다. 함수 바인딩은 hit event와 똑같이 AddDynamic 함수를 이용할 수 있다. 또한 이 함수 역시 Hit event 콜백 함수와 마찬가지로 UFUNCTION() 으로 선언해 주어야 함에 유의한다.

이 이벤트는 GameplayStatics::ApplyDamage 함수를 통해 발생시킬 수 있다.

profile
베이비 게임 개발자

0개의 댓글