개발 낙서장

[Unity 3D] 플레이어 스탯 관리 본문

Unity/Devlog

[Unity 3D] 플레이어 스탯 관리

권승준 2022. 5. 18. 02:15

구현 동기

RPG에서 기본 중의 기본이라 함은 성장이다.
사냥을 해서 레벨업을 하고 좋은 아이템을 장비해서 능력치를 올리고 강화 등의 아이템 투자를 통해 더욱더 강력해져서 더욱 강한 보스나 레이드에 도전하고 클리어하는 것이 궁극적인 목표라고 할 수 있다.
이런 성장에 있어서 가장 기본이 되는 '스탯'은 RPG에서는 뗄레야 떼어놓을 수 없는 존재이다.
지금까지 수많은 RPG 게임을 해왔지만 어떠한 방식으로든 스탯 개념이 존재하지 않았던 게임은 없었다.

과거 메이플스토리에서는 직업 별로 최적의 스탯을 얻기 위해 수시간씩 스탯 주사위만 돌리던 사람이 많았다.

구현 내용

나는 아주 간단하게 스탯 시스템을 구현했는데, PlayerManager라는 스크립트를 만들고 여기서 모든 레벨과 능력치를 관리하게 해 주었다.

변수가 좀 많은데 다 캐릭터 능력치에 관련된 부분이다.
초기값을 설정했으며 능력치에 관련된 모든 부분은 UI, 몬스터의 죽음, 버프 시스템 등 다른 오브젝트를 통해 언제든 사용할 수 있도록 public 형식자로 선언했다.
내가 만들고 있는 게임은 플레이어가 한 명이므로 싱글톤 패턴으로 구현했다.

내가 설계한 경험치 시스템은 다음과 같다.

  • 별도의 총 경험치 량을 설정하지 않는다.
  • 레벨 1에서 레벨 2로 넘어가는 총경험치를 기준으로 삼아 레벨 별 구간마다 배율을 설정해 레벨 업과 동시에 총 경험치 량도 배율만큼 자동으로 늘어난다.

배열에 직접 레벨 별로 총 경험치 량을 설정해놓는 방법도 있고 JSON을 통해 레벨 별로 스탯과 경험치를 함께 관리하는 방법도 있지만 경험치 배율을 설정해 자동으로 늘어나게 하면 효율적이라고 생각해서 이렇게 구현했다.

이제 캐릭터 스탯 매니저는 만들었으니 스탯을 직접 볼 수 있는 UI를 만들어야 한다.

Player Icon


Player Name
Level
Str
Dex
Int
Luk
EXP Bar
Equipment

UI의 구성은 위와 같다. 간략하면서도 필요한 정보를 모두 얻을 수 있도록 했다.
플레이어의 이름과 능력치는 UI Text로 만들고 스크립트에서 객체를 받아 언제든 수정할 수 있게 했다.
EXP Bar는 현재 내 경험치가 얼마나 되는지 확인할 수 있도록 Image를 Filled로 설정해 경험치 바를 확인할 수 있게 하였고 중앙에 현재 경험치가 몇 % 인지 또한 확인할 수 있도록 텍스트를 배치하였다.

조금 조잡해 보이지만 Info UI를 간단하게 만들었다.
그럼 이 UI를 Update 해 줄 스크립트만 작성하면 끝이다!
정말 간단한데, 모든 값들을 변수로 받아서 UpdatePlayerStatus라는 함수 안에서 모든 값들을 변경할 수 있게 하면, 나중에 어디서든 이 함수만 호출하면 값들이 갱신된다.

이게 코드 전문이다.
아직 장비 창을 구현하지 않아서 굉장히 간단하긴 한데 저렇게 함수만 만들어놓으면 UI Update 끝이다.
OnEnable 함수 안에서 호출해놨기 때문에 UI가 활성화될 때마다 자동으로 갱신된 값이 출력되어 보일 것이다.
또 위에 있는 PlayerManager 스크립트의 GainExp 함수에서도 호출하게 했는데, UI가 열려있는 상태에서는 경험치를 얻어도 바로 갱신이 되지 않아서 만약 UI가 활성화(activeSelf : bool) 중이라면 이 함수를 호출하여 갱신해주었다.

구현 후기

다른 사람이 보면 정말 간단하고 조잡해 보일 수 있겠지만 개인적으로 만족스러운 작업이었다.
구상 단계부터 구현이 끝날 때까지 UI 이미지를 제외하곤 전부 내 아이디어로 구현해서 더 재미있었다.

저기서 추가할 부분은 메이플스토리처럼 레벨 업하면 스탯 포인트가 주어지고 각 스탯을 직접 올릴 수 있도록 할 것이다.
밑에 장비 창을 구현하는 부분이 꽤 힘들 것 같은데 이 부분은 여러 유튜브랑 글을 참고해서 제작해야겠다.

Comments