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

 

HUD UI에 경험치 데이터를 바인딩해본다.

 

AI를 죽이면 AI에게서 얻을 수 있는 경험치를 플레이어에게 전달하고 축적해 레벨업하는 기능을 구현한다.

  • 캐릭터 스탯 컴포넌트에서는 죽일 시 얻을 수 있는 경험치를 제공해야 하고, 캐릭터 클래스에서 캐릭터 스탯 컴포넌트를 통해서 가져올 수 있어야 한다.
  • 플레이어 스테이트에는 플레이어의 축적 경험치를 보관하도록 설계해야 한다.
  • 캐릭터가 죽을 때 AI가 플레이어에게 죽은 것인지 검사하고, 플레이어 컨트롤러를 통해 플레이어 스테이트를 갱신하는 로직을 추가해야 한다.

 

우선, 플레이어 스테이트에서 경험치 비율을 반환하는 함수와 경험치를 축적하는 함수를 선언한다.

 

 

게임 인스턴스의 ABCharacterTable에서 레벨에 해당하는 한 행을 가져와 저장할 CurrentStatData 변수를 선언한다.

  • SetCharacterLevel() 함수는 이 작업을 수행하고 CharacterLevel 변수를 갱신한다.

 

 

게임 인스턴스에서 게임 데이터를 가져오기 위해 헤더를 선언한다.

 

경험치의 기본값은 0으로 설정한다.

 

 

현재 InitPlayerData() 함수는 게임 모드의 PostLogin() 함수에서 호출된다.

 

CharacterLevel 변수를 설정하고 레벨에 해당하는 게임 데이터를 CurrentStateData에 저장한다.

 

경험치는 0으로 초기화한다.

 

 

프로그레스 바에 경험치를 표시하기 위해 경험치 비율을 반환하는 함수를 구현한다.

  • 부동 소숫점을 비교할 떄는 정확한 0.0보다는 KINDA_SMALL_NUMBER를 사용하는 것이 좋다.
  • 나누는 수가 0이면 오류가 발생하므로 확인해야 한다.

 

 

경험치를 축적하는 함수다.

 

경험치를 축적한 결과 레벨업 경험치 이상이 되었으면, 레벨업 경험치만큼 차감하고 레벨업을 진행한다.

  • 레벨업에 성공했으면 새로운 레벨에 해당하는 게임 데이터를 다시 불러와야 한다.
  • HUD UI 갱신을 위해 레벨업 여부와 관계 없이 OnPlayerStateChanged 델리게이트는 발동해야 한다.

 

 

레벨에 해당하는 게임 데이터 한 행을 게임 인스턴스의 데이터 테이블에서 가져와 CurrentStatData 변수에 저장하고 새로운 레벨을 설정한다.

 

 

이제 HUD UI에서 플레이어 스테이트로부터 경험치 비율을 얻어와 경험치 프로그레스 바도 갱신하도록 설정한다.

 

 

캐릭터 스탯 컴포넌트에서는 캐릭터 클래스에 AI를 죽일 시 얻을 수 있는 경험치를 제공해야 한다.

 

 

캐릭터 클래스에서도 캐릭터 스탯 컴포넌트를 통해 죽일 시 얻을 수 있는 경험치를 제공한다.

 

 

AI를 죽였을 때 경험치를 축적하기 위해 호출할 NPCKill() 함수를 선언한다.

  • 캐릭터 클래스에서 죽일 시 얻을 수 있는 경험치를 GetExp() 함수를 통해 제공하고 있다.

 

플레이어 스테이트를 저장할 변수를 선언한다.

 

 

필요한 헤더를 포함한다.

 

 

BeginPlay() 함수에서 플레이어 스테이트를 가져온다.

  • 플레이어 컨트롤러의 초기화가 끝나는 시점인 PostLogin() 함수를 오버라이드해서 그 곳에서 가져와도 된다.

 

 

AI를 죽이게 되면 해당하는 경험치를 플레이어 스테이트에 축적한다.

 

 

캐릭터 클래스의 데미지를 입을 때 호출되는 TakeDamage() 함수이다.

 

캐릭터 스탯 컴포의 SetDamage() 함수에는 체력이 0일 때 OnHPIsZero 델리게이트가 발동하고, 이 델리게이트에는 캐릭터의 상태는 ECharacterState::DEAD로 만드는 람다 함수가 등록외어 있다.

 

체력이 다 떨어져 죽은 상태이면 다음을 수행한다.

  • EventInstigator(가해자, 때린 사람)가 플레이어 컨트롤러인지 확인한다.
  • 플레이어 컨트롤러에게 죽었으면 자신을 전달해 자신의 경험치를 축적하라고 NPCKill() 함수를 호출한다.

 

데미지를 입을 때마다 아래 과정을 수행하지 않고, APawn::LastHitBy 프로퍼티를 통해 AI가 소멸할 때 1번 처리하는 것이 더 효율적이긴 하다.

 

 

AI를 죽이면 프로그레스 바에서 경험치가 차오르는 것을 확인할 수 있다.

 

profile

Make Unreal REAL.

@diesuki4

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

검색 태그