UE5 멀티대전게임 일기

UE5 멀티대전게임 일기(7) 캐릭터 TakeDamage함수 구현

언리얼배우기 프로젝트 2025. 4. 7. 01:22

1. 맞는 몽타주, 죽는 몽타주, 넉백 몽타주변수 생성

2. TakeDamage()함수 구현

CharacterBase.h


// 헤더 추가
#include "GameFramework/DamageType.h"

...

// ================TakeDmage()함수용================
// 피격 애니메이션
UPROPERTY(EditAnywhere, Category = "Animation")
UAnimMontage* HitReactionMontage;
// 사망 애니메이션
UPROPERTY(EditAnywhere, Category = "Animation")
UAnimMontage* DeathMontage;
//===================================================

...

// TakeDamage함수
UFUNCTION(BlueprintCallable, Category = "Stat")
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;
CharacterBase.cpp


float ASW_CharacterBase::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
    const int32 DamageToApply = FMath::Clamp(FMath::RoundToInt(DamageAmount), 0, Health);
    if (DamageToApply <= 0) return 0.f;

    Health -= DamageToApply;

    // 체력바 UI 업데이트
    UpdateHealthBar();

    // 사망이 아닐 경우 피격 처리
    if (Health > 0)
    {
        // 피격 애니메이션 재생
        if (HitReactionMontage && !bIsLocked)
        {
            PlayAnimMontage(HitReactionMontage);
        }

        // 넉백 처리 (이동만 물리적으로)
        if (DamageCauser)
        {
            FVector KnockbackDir = (GetActorLocation() - DamageCauser->GetActorLocation()).GetSafeNormal();
            LaunchCharacter(KnockbackDir * 500.f + FVector(0.f, 0.f, 200.f), true, true);
        }
    }
    else
    {
        // 체력 최소값 보정
        Health = 0;

        // 사망 애니메이션
        SetLockedState(true); // 이동/입력 잠금
        if (DeathMontage)
        {
            PlayAnimMontage(DeathMontage);
        }

        // TODO: 사망 후 파괴 or 리스폰 처리 (필요시 타이머로 처리 가능)
    }

    return DamageToApply;
}

 

CharacterBase.h에 피격애니메이션 몽타주와 죽는 애니메이션 몽타주를 생성했기때문에 CharacterBase를 상속받는 캐릭터들 BP에 보면 애니메이션 몽타주가 추가되었고, 각각 상황에 맞는 애니메이션 몽타주를 넣어준다.

 

ex) Brall캐릭터와 Dubu캐릭터 BP확인

 

체력이 깍일때마다 Hit Reaction Montage에 애니메이션 몽타주가 실행되고, 체력이 0이되면 Death Montage에 애니메이션 몽타주가 실행됨.