Make Unreal REAL.
article thumbnail
이득우의 언리얼 C++ 게임 개발의 정석

 

게임 진행 난이도를 점진적으로 높이고 재미를 위해 전투에 관련된 기획 요소를 추가해본다.

  1. HP는 레벨업 시에만 회복된다.
    이것은 이미 구현되어 있다.
  2. 무기를 들고 있을 때 더 긴 공격 범위를 갖는다.
  3. 무기에 랜덤으로 공격력 증가치를 부여해 최종 공격력을 계산한다.
  4. 현재 게임 스코어에 따라 NPC의 레벨도 증가하도록 한다.

 

ABWeapon 클래스에 다음 변수들을 선언한다.

  • AttackRange: 공격 범위
  • AttackDamage: 공추가 공격력
  • AttackModifier: 공격력 증가치
  • AttackDamageMin: 랜덤으로 추가 공격력을 정할 때 최소 공격력
  • AttackDamageMax: 랜덤으로 추가 공격력을 정할 때 최대 공격력
  • AttackModifierMin: 랜덤으로 공격력 증가치를 정할 때 최소 증가치
  • AttackModifierMax: 랜덤으로 공격력 증가치를 정할 때 최대 증가치

 

현재 ABWeapon을 상속 받은 블루프린트 클래스인 BP_WeaponAxe도 있으므로, (EditAnywhere, BlueprintReadWrite) 키워드를 지정해 일부 변수들은 BP에서 값을 변경할 수 있도록 한다.

 

 

생성자에서 기본값을 설정해주고 Getter를 구현한다.

 

 

BeginPlay() 함수에서 FMath::RangRange() 함수를 통해 추가 공격력과 공격력 증가치가 결정되도록 한다.

 

 

무기를 습득하면 공격 범위가 늘어나도록 설계했으므로, 캐릭터의 기본 공격 범위는 줄여준다.

 

 

기존에는 무기를 장착하고 있으면 새로운 크기를 습득할 수 없었는데, 항상 새로운 무기를 장착할 수 있도록 변경한다.

 

 

이미 무기를 장착하고 있으면 AActor::DetachFromActor() 함수를 이용해 기존 무기를 부모 액터로부터 떼어낸다.

  • FDetachmentTransformRules::KeepWorldTransform
    월드에서는 동일하게 보이도록 떼어낸다.
    Transform 정보가 바뀔 수 있다.
  • FDetachmentTransformRules:KeepRelativeTransform
    Transform 정보를 유지하며 떼어낸다.
    월드에서 보이는 보습이 달라질 수 있다.

 

떼어낸 무기는 AActor::Destroy() 함수로 소멸시켜주고 댕글링 포인터를 방지하기 위해 NULL로 초기화해준다.

 

 

무기가 없으면 캐릭터의 기본 공격 범위를 반환하고, 무기가 있으면 무기에 설정된 공격 범위를 반환한다.

 

 

무기가 없으면 캐릭터 스탯 컴포넌트의 공격력만 사용하고, 무기가 있으면 캐릭터 스탯 컴포넌트와 무기에 설정된 공격력과 증가치를 고려해 최종 공격력을 계산한다.

 

 

플레이어의 기본 공격 범위를 사용하던 부분을 GetFinalAttackRange()의 값으로 변경해준다.

 

 

TakeDamage() 함수에 기본 공격력이 아닌 GetFinalAttackDamage()의 값을 전달한다.

 

 

AI 행동 트리의 플레이어가 공격 범위 내에 들어왔는지 판단하는 데코레이터에서도 범위를 변경해준다.

 

 

마지막으로 게임 점수에 따라 AI의 레벨을 조정하는 기능을 구현한다.

  • 게임 모드에서 게임 스테이트를 통해 현재 게임 점수를 제공하도록 한다.

 

 

헤더를 포함한다.

 

 

캐릭터 에셋을 로딩하는 캐릭터 클래스의 LOADING 상태에서 AI일 경우, (현재 게임 점수 x 0.8)을 올림한 수를 레벨로 설정해 캐릭터 스탯 컴포넌트에 스탯을 갱신하도록 한다.

  • FMath::CeilToInt() 함수를 통해 올림을 할 수 있다.
  • FMath::Clamp() 함수를 통해 값의 범위를 제한할 수 있다.

 

 

무기에 랜덤 능력치를 부여하고 게임 점수에 따라 AI의 레벨을 설정하는 데 성공했다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그