1. 데미지 이벤트(FDamageEvent)

액터가 발생시키는 데미지의 형태를 가리키는 구조체이다.

UE 5.1 이상부터는 헤더에 다음을 포함해야 한다.

#include "Engine/DamageEvents.h"

 

(1) FPointDamageEvent - 점 데미지 이벤트

탄환과 같이 한 점에 맞는 데미지 종류.

 

(2) FRadialDamageEvent - 방사형 데미지 이벤트

수류탄, 폭발과 같이 구형으로 퍼져나가는 데미지 종류.

 

 

2. 데미지 입히기

	// 라인트레이스
	FHitResult Hit;

	bool bSuccess = GetWorld()->LineTraceSingleByChannel(Hit, Location, End, ECollisionChannel::ECC_GameTraceChannel1);
	if(bSuccess)
	{
		// 총알이 날아오는 방향
		FVector ShotDirection = -Rotation.Vector();
		UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), HitFlash, Hit.Location, ShotDirection.Rotation());
		
		if (Hit.GetActor())
		{
			FPointDamageEvent DamageEvent(Damage, Hit, ShotDirection, nullptr);
			Hit.GetActor()->TakeDamage(Damage, DamageEvent, OwnerController, this);
		}
	}

 

이전 포스트의 라인 트레이스 코드 이후에 코드를 추가한다.

 

5. 라인 트레이스(LineTraceSingleByChannel)

1. 개요 일반적인 TPS 또는 FPS 게임에서 캐릭터의 총구에서 총알이 나가는 것보다, 카메라가 바라보는 곳의 정중앙에서 총알이 나가는 것이 더 직관적으로 작동한다. 또한 특정 물체는 지나가게

crat.tistory.com

(1) DamageEvent

- 총에서 발생한 라인 트레이스가 발생시키는 데미지 이벤트는 FPointDamageEvent(점 데미지 이벤트)이다.

FPointDamageEvent는 피해량, FHitResult 구조체(Hit 정보가 담긴 구조체), 발사 방향 벡터, 데미지 타입 클래스(UDamageType)의 4가지 인수를 받는 생성자로 오버로딩 할 수 있다.

 

- 발사 방향은 탄환이 발사되어 온 방향이다(탄환의 발사 방향의 반대 방향)

 

(2) FHitResult 사용

- FHitResult로 선언된 Hit 구조체에는 라인 트레이스에 의해 발생한 타격 판정에 대한 정보들이 담겨져 있다.

- Hit 구조체는 맞은 액터를 기준으로 한다.

 

(3) AActor::TakeDamage

- TakeDamage 함수는 피해량, 데미지 이벤트, 데미지와 연관된 컨트롤러, 데미지 발생자(원인)의 4개의 인수를 가진다.

 

 

3. 데미지 받기

(1) 최대 체력, 체력 개념 도입 - ShooterCharacter.h

	UPROPERTY(EditDefaultsOnly)
	float MaxHealth = 100.f;

	UPROPERTY(VisibleAnywhere)
	float Health;

최대 체력 값은 사양에 따라 변경할 수 있도록 EditDefaultsOnly로 지정한다(모든 인스턴스가 동일한 값을 가짐).

체력 값은 외부에서 변경할 수 없지만 확인할 수 있도록 VisibleAnywhere로 지정한다.

void AShooterCharacter::BeginPlay()
{
	Super::BeginPlay();

	Health = MaxHealth;

이후 BeginPlay에서 체력을 최대 체력으로 초기화한다.

 

 

(2) TakeDamage 함수 오버로딩

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	virtual float TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;
float AShooterCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
	float DamageApplied = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);

	DamageApplied = FMath::Min(Health, DamageApplied);
	Health -= DamageApplied;

	UE_LOG(LogTemp, Display, TEXT("Your message %f"), Health);

	return DamageApplied;
}

새롭게 도입한 체력에 받은 데미지를 계산하도록 TakeDamage 함수를 오버로딩한다.

헬스 컴포넌트를 사용하지 않고 액터 내에 이런 방법을 사용하여 데미지를 입도록 구현할 수도 있다.