[Unreal/C++] ApplyDamage, TakeDamage 데미지 전달
Unreal Engine 5
언리얼 엔진에서 데미지를 주고 받는 기본적인 형식입니다.
UGameplayStatics::ApplyDamage()
AActor::TakeDamage()
ApplyDamage를 사용하기 위해서 헤더파일을 필요로합니다.
#include "Kismet/GameplayStatics.h"
데미지를 가할 경우 보통 BeginOverlap 등 충돌과 연관되는 것이 많기에 BeginOverlap 안에 정의했습니다.
void MyActor::OnBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
UGameplayStatics::ApplyDamage(OtherActor, 10, GetOwner()->GetInstigatorController(), this, UDamageType::StaticClass());
UGameplayStatics::ApplyDamage(피해자, 데미지, 가해자컨트롤러, 총알 등, 데미지 타입);
}
위에서 사용된 함수의 원형은 이렇습니다.
float UGameplayStatics::ApplyDamage(AActor* DamagedActor, float BaseDamage, AController* EventInstigator, AActor* DamageCauser, TSubclassOf<UDamageType> DamageTypeClass)
DamagedActor = 데미지를 받을 대상
BaseDamage = 기본 데미지
EventInstigator = 가해자 (검, 총알, 스킬 등의 소유자)
DamageCauser = 데미지를 주는 직접적인 물체 등
DamageTypeClass = 데미지 타입, 필요시 상속받아 구현하여 화염 데미지나 냉기 데미지 등으로 구현
TakeDamage는 Actor에 구현되어 있습니다.
필요한 경우 override를 통해 데미지를 받을 수 있습니다.
// .h
public :
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser) override;
// .cpp
float MyActor::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
return DamageAmount;
}
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser)
DamageAmount = 전달받은 데미지
DamageEvent = 데미지 정보
EventInstigator = 가해자 ( GetPawn()을 통해 대상을 가져올 수 있습니다. )
DamageCauser = 피해를 입힌 물체
이처럼 언리얼 엔진에서는 데미지에 관해 미리 구현되어 있습니다.ApplyDamage를 통해 데미지를 주고 TakeDamage를 구현한다면 간편하게 사용할 수 있습니다. 이외에도 Radial이나 Point 데미지 등이 있으니 참고하시길 바랍니다.
Instigator
Instigator (인스티게이터)는 누가 대미지를 입혔는가, 전형적으로 PlayerController 또는 AIController 가 됩니다. 화염 대미지의 경우, 플레이어 또는 불을 지른 AI 가 될 것입니다.
DamageCauser
"causer" (유발자)는 보통 무엇이 대미지를 입혔는가, 이를테면 방금 걸어지나간 ACampFire (캠프 파이어) 액터같은 것입니다.
DamageType
DamageType (대미지 타입)은 대미지의 근원지와 무관하게 "유형"을 설명하는 데 사용되는 오브젝트입니다. 대미지 근원지가 많고 그 사이에 공통된 함수성이 있었으면 하는 경우 매우 유용한 개념입니다.
이를 쉽게 설명하는 예로 화염 대미지를 들 수 있습니다.
화염에 대한 대미지 유형(UDamageTypeFire)을 정의한 다음, 거기에 일정 유형의 HandleDamagedCharacter() 함수를 주고, TakeDamage() 호출 체인에서 적절히 호출해 주면 됩니다.
TakeDamage
TakeDamage는 Actor에 정의되어 있습니다. 필요한 경우 override하여 사용할 수 있습니다.
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, class AActor* DamageCauser);
마찬가지로 대미지에 반응하기 위해, 받는 액터에서 TakeDamage() 를 덮어써서 별도의 처리 코드를 삽입해 주기만 하면 됩니다. 쉽지요!
'Unreal > Manual' 카테고리의 다른 글
Unreal 게임이 실행중인지 에디터에서 편집중인지 확인하기 (0) | 2023.12.28 |
---|---|
Unreal Widget Component TextBlock 사용하기 (0) | 2023.12.28 |
Unreal WidgetComponent ProgressBar 추가, 적 체력 UI (0) | 2023.12.27 |
Unreal AnimMontage Slot 추가하기 (0) | 2023.12.21 |
Unreal GenericTeamID 설정하기 (0) | 2023.12.18 |