본문 바로가기
Unreal/Manual

Unreal ApplyDamage, TakeDamage 데미지 전달

by Dev_카페인 2023. 12. 27.
반응형

[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() 를 덮어써서 별도의 처리 코드를 삽입해 주기만 하면 됩니다. 쉽지요!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

UE4 에서의 대미지

대미지는 베이스 Actor 클래스에 지원되는 기능이므로, 폭넓게 사용 가능합니다. 이 시스템은 자주 쓰이는 함수성을 쉽게 접근할 수 있도록 해 주어 빠른 결과 확인이 가능하면서도, 확장이 가능

www.unrealengine.com

 

 

 

AActor::TakeDamage

Apply damage to this actor.

docs.unrealengine.com

 

 

UGameplayStatics::ApplyDamage

Hurts the specified actor with generic damage.

docs.unrealengine.com

 

 

 

반응형