게임개발/Unreal C++

[Unreal]#10_Damage + Health 구현

Hardii2 2022. 8. 21. 14:48

[Unreal]#10_Damage + Health 구현

Unreal 개발 중 "Gun Actor"에 대해 알아보겠습니다.

"Simple Shooter Game"의 Character Class 개발 과정 중 일부입니다.

 

 


 

Health

1. AShooterCharacter.h

// Character.h 내부...
class Character : public ACharacter
{
//...

public:
    virtual float TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;
    
    // BlueprintPure와 const는 같이 갑니다.
    // BlueprintPure = No Execution Pin -> Always have same result or effect on program 
    UFUNCTION(BlueprintPure)
    bool IsDead() const;
    
private:
    UPROPERTY(EditAnywhere)
    float MaxHealth = 100;
    
    UPROPERTY(EditDefaultsOnly)
    float Health;
};
  1. IsDead 메서드 선언
  2. MaxHealth, 최대 체력 변수 선언
  3. Health, 현재 체력 변수 선언

 

2. AShooterCharacter.cpp

// Character.cpp 내부...
void AShooterCharacter::BeginPlay()
{
    //...
    Health = MaxHealth;
}

float AShooterCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
    	// 상위 클래스의 메서드를 먼저 호출합니다.
	float DamageToApply = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
	
   	 // Health 값이 0이 될 때까지만 감소합니다.
	DamageToApply = FMath::Min(Health, DamageToApply);
	Health -= DamageToApply;
    
	if(IsDead() == true)
	{
		DetachFromControllerPendingDestroy();
		GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	}
    
   	 return DamageToApply
}

bool AShooterCharacter::IsDead() const
{
	if(Health <= 0)
		return true;
	else
		return false;
}
virtual void APawn::DetachFromControllerPendingDestroy()
  • Controller로부터 Pawn을 안전하게 떼어 놓기 위한 메서드입니다.
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
  • Character의 캡슐 컴포넌트를 가져와 Collision 기능을 꺼버립니다.