Undead Survivor 게임 개발 4일차

mingu Lee·2025년 4월 8일

오늘은 게임의 HUD와 Player의 능력 Upgrade 기능을 구현했다.

HUD


현재 경험치, Kill 수, Level 등 게임 진행에 필요한 UI를 구성했다.

맨 위는 현재 Level의 경험치 바, 왼쪽부터 Kill 수, 남은 시간, 현재 Level, Player 아래는 Player의 체력이다.

경험치 바와 Player 체력은 Slider를 사용하여 만들었다.

위 값들은 GameManager에서 관리하고 있으므로 위 값에 해당하는 UI Object를 관리할 HUDManager를 만들어서 GameManager에서 위 값들이 변경되면 HUDManager를 호출하는 방식으로 구현했다.

위 사진은 GameManager의 일부.

위 사진은 HUDManager의 일부.

이미 많이 해본 작업이라 어렵지않게 구현했다.

적을 잡을 때마다 Kill 수가 증가, 상단의 경험치 바가 차면서 모두 차면 Level 상승, 남은 시간 등이 제대로 보이는 것을 볼 수 있다.

녹화 프레임이 낮은 탓에 움직일 때마다 체력 바가 부들부들거리는데 실제 게임 플레이 때는 정상적으로 작동한다.

UI 오른쪽에 보이는 것은 아래에서 리뷰하겠다.

Player의 능력 UI


위 영상에서 보이듯이 UI 오른쪽에 Player의 능력들을 배치해놨다.

특정 능력의 Level을 보여주는 UI로써, 게임 진행 시 특정 능력을 얻을 때마다 해당 능력의 Level이 상승한다.

현재는 임시로 Button을 추가하여 능력을 누를 때마다 해당 능력의 Level이 증가하는 식으로 구현했다.

위부터 차례로 근접 무기, 원거리 무기, 장갑, 신발, 힐팩 총 5개 이다.

근접 무기는 Level이 오를 때마다 Damage와 개수가 증가하며 Player 주변을 원 형태로 돌아다닌다.

원거리 무기는 Player가 Enemy를 향해 총알을 발사하는데, Level이 오를 때마다 Damage와 관통 수가 증가한다.

장갑은 Level이 오를 때마다 근접 무기의 회전 속도, 원거리 무기의 발사 속도가 증가한다.

신발은 Level이 오를 때마다 Player의 이동속도가 증가한다.

힐팩은 먹으면 Player의 체력이 최대로 채워진다.

ItemData


UI를 구성한 후 특정 Item이 어떤 정보와 값들을 가지고 있는지 정보를 담을 ItemData라는 ScriptableObject를 만들었다.

위 사진처럼 코드를 작성하면 Project Tab에서 위 Scriptable Object를 생성할 수 있다.

ItemData를 만들어보면 아래와 같이 생긴 Data가 만들어진다.

위 사진은 근접 무기의 정보를 담은 ItemData이다.

Item Type부터 Name, Icon, Level별 Damage 등 특정 Item의 정보를 담은 Data를 만들 수 있다.

이렇게 만든 Data를 Script 상에서 ItemData 자료형인 변수를 만들어서 사용할 수 있는데, 이 값을 사용하여 로직을 구현하면 된다.

능력 Upgrade


각 Button에 Script를 추가하여 Button마다 ItemData를 하나씩 할당했고, Button을 누르면 아래 로직에 따라 능력 Upgrade를 구현했다.

위 사진은 Button Click Event에 연동한 함수이다.

특정 Item의 Level이 최대치에 도달하면 Button의 Interaction을 비활성화하여 더 이상 누르지 못 하게 했다.

먼저, 능력 Type이 Melee(근접 무기), Range(원거리 무기)일 때를 살펴보겠다.

처음 능력을 얻은 경우에는 Weapon이라는 Component를 추가한 GameObject를 생성했고, Init 함수를 호출하여 초기값을 세팅했다.

Player의 자식으로 추가하고, ItemData 값을 기반으로 초기값을 설정해주었다.

근접 무기의 경우 Speed는 회전 속도, 원거리 무기는 공격 Interval 이다.

위 사진처럼 Init을 한 후, 다시 LevelUp 함수를 통해 해당 무기의 Damage와 Count 값을 설정했다.

처음에는 근접 무기, 원거리 무기 모두 Level 0이라서 아무것도 없다가 근접 무기를 누를 때마다 개수가 증가하고, 처음 원거리 무기를 누르면 총알을 발사하고 Level이 오르면 관통력이 증가하는 것을 볼 수 있다.

또한, Level Text도 1씩 증가하는 것을 볼 수 있다.

다음으로 능력 Type이 Glove, Shoe일 때를 살펴보겠다.

이 두 Item은 위에서 말했듯이 Glove는 공격속도, Shoe는 이동속도에 관련된 Item이다.

무기들은 ItemData의 Damage가 실제 Damage를 뜻하지만, 이 2개의 보조 Item들은 공이속 증가율로 설정했다.

위 사진은 Glove Item의 Data인데 Level마다 공격속도가 10%씩 증가하도록 값을 설정했다.

Glove랑 Shoe는 Weapon말고 Gear라는 Class를 만들어서 적용했다.

Gear의 Init 함수는 Weapon과 마찬가지로 초기값을 설정해주었다.

LevelUp 함수는 Level별 Rate 값을 설정하고, 각 Type에 따라 증가된 공이속을 Weapon에 적용시켜주었다.

Gear의 Type이 Glove라면 RateUp 함수를 호출하는데 Player 자식으로 있는 Weapon을 찾아서 Weapon의 Speed 값을 증가시켜주었다.

예를 들어 근접 무기의 회전 속도를 150f라고 가정했을 때, Rate가 0.1이면 15가 추가되어 회전 속도는 165f가 된다.

원거리 무기의 발사 Interval은 0.3f라고 가정했을 때, 0.3f * 0.9f = 0.27f 가 된다.

Gear의 Type이 Shoe라면 SpeedUp 함수를 호출하는데 간단하게 Player의 MoveSpeed만 증가시켜주었다.

위 영상은 Glove의 Level이 증가할 때마다 근접 무기의 회전 속도, 원거리 무기의 발사 속도가 증가하는 것을 볼 수 있다.

위 영상은 Shoe의 Level이 증가할 때마다 Player의 이동속도가 증가하는 것을 볼 수 있다.

마지막으로 능력 Type이 Heal일 때이다.

Heal Item은 간단하게 획득 시 Player의 체력을 100%로 회복시켜준다.

현재 계획에서는 Heal Item의 Level별 효과에 차이를 주지않았기 때문에 Heal Item은 Level이 올라가지 않게 했다.

아직 Player의 피격 Event를 구현하지 않아서 Heal Item의 효과는 확인할 수 없지만 간단한 로직이기에 오류날 가능성은 낮다고 생각한다.

추후 피격 로직이 완성되면 테스트를 진행해보겠다.

추가 사항으로, Glove를 먼저 LevelUp하고 Weapon을 처음 LevelUp한 경우엔 ApplyGear 함수가 호출되지 않아서 기존에 먹은 Glove의 공격 속도 증가 효과를 받지 못한다.

이 현상은 Weapon의 LevelUp 함수에 player.BroadcastMessage("ApplyGear") 코드를 추가하여 Player의 자식 Object들에게 ApplyGear 함수를 실행하게 하는 방법으로 방지했다.

오늘의 결과물


profile
Github: https://github.com/dlalsrn

0개의 댓글