언리얼엔진5 공부

데미지 처리 함수

Client Side 2025. 10. 14. 21:16

UGamePlayStatics::ApplyDamage()

  • 한 액터가 다른 액터에게 데미지를 주고 싶을 때 사용
  • 헤더파일 : #include “Kismet/GameplayStatic.h”

사용법

static float ApplyDamage(
    AActor* DamagedActor,           // 데미지를 받을 액터
    float BaseDamage,               // 기본 데미지 양
    AController* EventInstigator,    // 데미지를 일으킨 컨트롤러(플레이어/AI)
    AActor* DamageCauser,           // 데미지를 일으킨 실제 액터(무기 등)
    TSubclassOf<UDamageType> DamageTypeClass,  // 데미지 타입 클래스
    float DamageMultiplier = 1.0f   // 데미지 배율(기본값 1.0)
);

 

 

사용예시

// 기본 사용법 - 적에게 10의 데미지를 줌
float AppliedDamage = UGameplayStatics::ApplyDamage(
    EnemyActor,             // 데미지를 받을 적 액터
    10.0f,                  // 10의 데미지
    GetController(),        // 현재 캐릭터의 컨트롤러
    this,                   // 데미지 원인(자기 자신)
    UDamageType::StaticClass()  // 기본 데미지 타입
);

// 특별한 데미지 타입 사용 예시
float FireDamage = UGameplayStatics::ApplyDamage(
    EnemyActor,                      // 데미지 대상
    20.0f,                           // 20의 데미지
    PlayerController,                // 플레이어 컨트롤러
    FireWeapon,                      // 화염 무기
    UFireDamageType::StaticClass(),  // 화염 데미지 타입
    1.5f                             // 50% 추가 데미지
);

 

 

AActor::TakeDamage()

  • 액터가 데미지를 받을 때 호출되는 핵심 함수. 액터클래스에 정의.

 

사용법

virtual float TakeDamage(float DamageAmount, 
			FDamageEvent const& DamageEvent, 
			AController* EventInstigator, 
			AActor* DamageCauser);
  • DamageAmount : 데미지의 양 (float)
  • DamageEvent : 데미지 타입과 관련 정보
    • FDamage const& 과 const FDamage& 은 같은 의미다. 언리얼에서는 상수형참조라는 것을 더 명확히 하기 위해 const& 형식을 많이 쓴다.
  • EventInstigator : 데미지를 일으킨 컨트롤러 (보통 플레이어나 AI)
  • DamageCauser : 데미지를 일으킨 실제 액터 (예: 무기, 폭발물)

 

사용 예시

float AMyCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
    float ActualDamage = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
    
    if (ActualDamage > 0.0f)
    {
        // 체력 감소
        Health -= ActualDamage;
        
        // 체력이 0 이하면 죽음 처리
        if (Health <= 0.0f)
        {
            Die();
        }
    }
    
    return ActualDamage;
}