UPROPERTY(EditAnywhere, Category="Combat")
float MaxHealth = 100.f;
float CurrentHealth;
초기화
AMonsterCharacter::AMonsterCharacter()
{
CurrentHealth = MaxHealth;
}
TakeDamage) 구현float AMonsterCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent,
AController* EventInstigator, AActor* DamageCauser)
{
const float ActualDamage = FMath::Clamp(DamageAmount, 0.f, MaxHealth);
CurrentHealth -= ActualDamage;
UE_LOG(LogTemp, Warning, TEXT("몬스터 피격! 남은 체력: %.0f"), CurrentHealth);
if (CurrentHealth <= 0.f)
{
Die();
}
return ActualDamage;
}
void AMonsterCharacter::Die()
{
UE_LOG(LogTemp, Warning, TEXT("몬스터 사망"));
GetCharacterMovement()->DisableMovement();
SetLifeSpan(5.f); // 5초 후 제거
}
AttackPlayer() 수정
void AMonsterCharacter::AttackPlayer()
{
if (!TargetPlayer) return;
UGameplayStatics::ApplyDamage(TargetPlayer, 20.f, GetController(), this, UDamageType::StaticClass());
}
플레이어 캐릭터(A<YourCharacter>)에 동일하게 MaxHealth, CurrentHealth, TakeDamage, Die() 구현.
UPROPERTY(EditAnywhere, Category="Combat")
float MaxHealth = 100.f;
float CurrentHealth;
float AYourCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent,
AController* EventInstigator, AActor* DamageCauser)
{
CurrentHealth -= DamageAmount;
if (CurrentHealth <= 0.f)
{
Die();
}
return DamageAmount;
}
void AMyProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, ...)
{
if (OtherActor && OtherActor != this)
{
UGameplayStatics::ApplyDamage(OtherActor, 25.f, GetInstigatorController(), this, UDamageType::StaticClass());
}
Destroy();
}
| 구성 요소 | 역할 |
|---|---|
| MonsterCharacter | 공격 시 플레이어 체력 감소, 피격 시 체력 감소 및 사망 처리 |
| PlayerCharacter | 몬스터 공격 시 체력 감소 및 사망 처리 |
| Projectile | 피격 대상에 데미지 전달 |
| AIController & BT | 기존 추적·공격 로직 그대로 사용, 데미지만 연동 |