공부중
[UE4]ApplyDamage, ApplyPointDamage, ApplyRadialDamage 본문
언리얼 엔진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
'Programing > UnrealEngine' 카테고리의 다른 글
[UE]프로젝트 패키지를 하고 나온 exe파일 속성 변경 (0) | 2022.08.29 |
---|---|
[UE4] 슬레이트(Slate) 디버그 툴 - 테스트 스위트 (0) | 2022.06.12 |
[UE4]ERROR: cmd.exe failed with args /c "rungradle.bat경로" :app:assembleDebug (0) | 2017.12.12 |
[UE4]에러 - You do not have any debugging symbols required to display the callstack for this crash. (0) | 2017.11.02 |
[UE4]머테리얼 – 오파시티(불투명도,Opacity) (0) | 2015.08.18 |