-
블루아카이브 루트슈터 팬게임 프로젝트(17) - 체력 컴포넌트 교체루트슈터 프로젝트 2024. 1. 17. 18:17
안녕하세요. 이틀동안 포스팅이 없었는데, 야간알바를 하느라 조금 쉬어서 개발이 진행되지 않았었습니다. 아무튼 이번에는 체력 컴포넌트를 교체하였습니다. 사실 교체 라는 단어보다는 삭제라는 단어가 더 어울립니다만.. 이제는 적과 플레이어에게 체력컴포넌트를 부여하지 않고 각 클래스에서 따로 체력을 관리하는 함수를 구현해두기로 했습니다.
그 이유는
1. 플레이어와 적은 서로 다른 체력 및 데미지 매커니즘을 가지도록 게임을 설계 하면서 컴포넌트 하나가 두 종류의 객체의 체력을 관리하는게 힘들어짐
2. 체력의 변동을 UI와 연동해야되는데 이를 체력 컴포넌트 하나가 조정하려면 컴포넌트가 너무 많은 헤더파일을 가져야함
큰 이유는 이 2개가 되겠네요. 지금와서는 차라리 체력 컴포넌트는 파괴 가능한 오브젝트에만 적용하고 적과 캐릭터는 따로 체력 매커니즘을 클래스에 구현하는게 좋을 것 같다는 생각이 들어 이번에 따로 코드를 작성하게 되었습니다.
EnemyCharacter.h
public: UPROPERTY(EditDefaultsOnly, Category = "Enemy Stat") float enemyHP; UPROPERTY(EditDefaultsOnly, Category = "Enemy Stat") float enemyNowHP; private: virtual float TakeDamage(float DamageAmount, struct FDamageEvent const & DamageEvent, class AController * EventInstigator, AActor * DamageCauser) override;
먼저 적들의 체력 매커니즘부터 만듭니다. 사실 적들은 체력시스템이 복잡하지는 않습니다.
하나 여기서 주목할 점은 체력컴포넌트에서는 OnTakeAnyDamage에 함수를 바인딩 하여 그 함수에 체력을 처리하는 방식으로 진행하였으나 액터 클래스에서는 언리얼에서 만들어진 TakeDamage 함수는 오버라이드 하여 사용한다는 것입니다. 기본에 OnTakeAnyDamage를 바인딩 하는 방식은 에러가 발생합니다.
EnemyCharacter.cpp
float AEnemyCharacter::TakeDamage(float DamageAmount, FDamageEvent const &DamageEvent, AController *EventInstigator, AActor *DamageCauser) { Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser); enemyNowHP -= DamageAmount; this->ShowHPBar(enemyNowHP / enemyHP); if(Cast<AProjectile>(DamageCauser)) { this->ShowDamageIndicator(DamageAmount, Cast<AProjectile>(DamageCauser)->bIsCritical); } if(enemyNowHP <= 0.0f && bluelandsGameMode) bluelandsGameMode->ActorDied(this); return enemyNowHP; }
virtual 함수를 override 하기 때문에 Super 선언을 꼭 해주셔야 합니다. 데미지를 받으면 적의 체력을 빼주고 체력바를 새로고침 해주고, 데미지 표시를 해주는 UI를 call 해줍니다. 그리고 체력이 0 이하로 떨어졌을시 게임모드에 죽음을 알려주면 됩니다. TakeDamage 함수는 float를 반환해야되는데, 어떤 값을 반환되야하는지 몰라서 일단은 남은 체력을 반환해주기로 했습니다.
PlayerCharacter.cpp
float APlayerCharacter::TakeDamage(float DamageAmount, FDamageEvent const &DamageEvent, AController *EventInstigator, AActor *DamageCauser) { Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser); playerNowHP -= DamageAmount; //플레이어의 죽음, 체력 자동회복에 대해 구현해야함 return playerNowHP; }
플레이어 또한 TakeDamage를 선언해주는데, 아직 기능들이 구현되지 않아 초라해 보입니다. 앞으로 콜오브듀티와 비슷한 자동회복 시스템 등등을 추가해볼 생각입니다.
이후 캐릭터와 적 블루프린트에서 체력 컴포넌트를 전부 빼주었습니다. 다음에는 적 웨이브 모드를 좀 더 손봐서 더 게임같은 느낌을 낼 수 있도록 하겠습니다.
'루트슈터 프로젝트' 카테고리의 다른 글
블루아카이브 루트슈터 팬게임 프로젝트(18) - 적 스폰 시스템 & 웨이브 게임모드(3) (0) 2024.01.20 블루아카이브 루트슈터 팬게임 프로젝트(18) - 적 스폰 시스템 & 웨이브 게임모드(2) (0) 2024.01.19 블루아카이브 루트슈터 팬게임 프로젝트(16) - 플레이어 캐릭터 모델링 교체 & 리타겟팅 (0) 2024.01.14 블루아카이브 루트슈터 팬게임 프로젝트(15) - 적 스폰 시스템 & 웨이브 게임모드(1) (1) 2024.01.14 블루아카이브 루트슈터 팬게임 프로젝트(14) - 플레이어 레벨, 경험치 시스템 (0) 2024.01.12