공부중

[UE4]ApplyDamage, ApplyPointDamage, ApplyRadialDamage 본문

Programing/UnrealEngine

[UE4]ApplyDamage, ApplyPointDamage, ApplyRadialDamage

곤란 2020. 1. 31. 18:33
반응형

언리얼 엔진4에서 기본적으로 데미지 종류는 아래와 같이 되어있다.

 

간단하게 설명하자면 

ApplyDamage는 그냥 특별한 처리 없이 데미지를 전달할때 쓰는것이고

ApplyPointDamage는 어떤 방향에서 Actor의 어디 부분에 맞았더니 데미지를 입었다 를 전달할때 쓰는것이고

ApplyRadialDamage는 특정 지역에 발생한 폭발때문에 데미지를 입었다 를 전달할때 쓴다.

 

위의 스크린샷처럼 BluePrint에서는 노드 만들고 가져다 쓰면 끝이지만 C++코드에서는 TakeDamage 하나만 존재하는것을 확인 할 수 있다.

virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, class AActor* DamageCauser);

데미지에 반응하기 위해서 데미지를 받는 액터에서 TakeDamage를 override한뒤 어떻게 처리할지를 정해주면 된다

여기서 PointDamage 또는 RadialDamage를 이용하고 싶다면 FDamageEvent의 자식들인 FPointDamageEvent, FRadialDamageEvent 를 이용해서 파라미터에 넣어주면 된다.

FHitResult hitResult(ForceInit);

/*
	LineTrace를 통한 Object 검출 코드는 생략
*/

APlayerBase* hitPlayerBase = Cast<APlayerBase>(hitResult.Actor);

if(nullptr != hitPlayerBase)
{
  FPointDamageEvent damageEvent;
  damageEvent.HitInfo = hitResult;

  hitPlayerBase->TakeDamage(20.0f, damageEvent, GetController(), this);
}

이렇게 데미지를 주는 측에서 데미지 전달을 해주고

float APlayerBase::TakeDamage(float Damage, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
	float finalDamage = Super::TakeDamage(Damage, DamageEvent, EventInstigator, DamageCauser);
    
    // 데미지 감소
	HP = HP - finalDamage;

	// PointDamage를 전달해줬으므로
	if (DamageEvent.IsOfType(FPointDamageEvent::ClassID))
	{
		const auto pointDamageEvent = (FPointDamageEvent*)&DamageEvent;

		FName boneName = pointDamageEvent->HitInfo.BoneName;
		
		// 헤드샷인 경우
		// FName::Compare
		// return	< 0 is this < Other, 0 if this == Other, > 0 if this > Other
		if (0 == boneName.Compare(FName(TEXT("Head"))))
		{
			HP = 0.0f;
		}
	}
    
    // ...
}

데미지를 받았을 때에는 FDamageEvent로 전달을 받았기 때문에

전달받은 데미지 타입이 FPointDamageEvent의 타입인지 체크를 하고

맞으면 적절한 형변환을 통해서 이용해주면 된다.

 

FPointDamageEvent, FRadialDamageEvent 뿐만이 아니라 다른 사용자정의 데미지 Event를 만들고 싶으면 FDamageEvent를 상속받아 만들고 위와같이 사용하면 된다.

 

참고글 

https://www.unrealengine.com/ko/blog/damage-in-ue4?lang=ko

 

반응형