오늘부터는 여태까지 배운 내용을 토대로 실제 3D RPG를 개발해보려고 한다.

우선은 RPG에서 사용되는 기본적인 기능들을 직접 구현해보면서 배운 내용들을 복습하며 3D 개발을 몸에 익히는 것이 목표이다. 루나 모바일이라는 게임의 기능들을 분석해서 일부 기능들을 구현해보기로 했다.

 

아래는 구현할 기능들을 정리한 내용이다.

 

==========================================

 

[필요한 에셋]
공격모션 3+ 이상, 대기 모션 2개 정도는 있는 플레이어 캐릭터 에셋.
플레이어 캐릭터, 방어구는 바꿀 수 있으면 좋고, 무기나 방패 정도는 바뀌었으면 좋겠지만 불가능해도 괜찮을 듯.
아이템, 포션 등 각종 아이콘은 이미지만 있으면 되니 따로 구해오면 될듯

대기 모션 + 이동 + 공격 모션 + 사망 모션이 있는 적 캐릭터.

=====구현할 기능===== (★ : 필수적으로 구현할 기능)
[캐릭터]
★대기 모션 1종+(가능하면 2종+)
★이동 모션 1종
★공격 모션 3종+
★사망 모션 1종
피격 모션 1종

 

10초마다 기본 대기모션 <-> 특수 대기모션 반복
★가상 조이스틱(화면에 터치한 지점에 생성)/WASD를 이용한 캐릭터 이동
★1초 이내 입력 시 최대 3회 연속 공격)
무기/방어구 변경할 때 캐릭터 모델에 적용(아이템 이미지와 이미지에 맞는 모델을 구해야 할 듯)
구현하려는 게임에서는 캐릭터의 피격모션이 없는 것 같음.

[몬스터]
★대기 모션 1종
★이동 모션 1종
★공격 모션 1종
★사망 모션 1종
피격 모션 1종

20~30초마다 근처 위치로 이동
★선제 공격을 받으면 플레이어 공격
몬스터는 두 종류 이상 있으면 좋을 듯

[인벤토리]
★플레이어 인벤토리
★플레이어 장비창
★적 처치 시 자동으로 아이템, 금화, 경험치 획득

★장비는 총 9종(무기, 방패, 장갑, 갑옷, 부츠, 반지, 목걸이, 귀걸이, 벨트)
무기, 방패 변경할 때 플레이어 모델에 적용

★장비를 클릭하면 능력치가 나오고 잠금/강화/옵션/판매/장착 가능.
잠금하면 강화/판매 불가능, 옵션을 누르면 강화석(보석) 장착 가능.

장비창이 꽉찼을 때 아이템을 획득하면 최대 6시간까지 보관되는 임시 아이템 탭 추가(최대 50칸)

아이템 강화석 슬롯, 장착 기능(최소 1슬롯 ~ 최대 4슬롯)
인벤토리 스크롤?

[플레이어 스탯]
★물리 공격력, 마법 공격력 (고정 수치)
★물리 방어력, 마법 방어력 (방어구 => 고정 수치, 악세서리 => % 수치)
★물리 속성 저항(% 수치)
★원소 속성 저항(% 수치, 얼음, 불, 독, 빛)
★최대 체력, 최대 마나 %

장비 변경 시 스탯 변경사항 표시

 

[기타]
적 몬스터를 골라서 자동 전투를 눌러 자동 전투 구현(자동 이동?)
일정 시간 이상 입력이 없으면 절전 모드로 전환
물약 / 자동 물약 기능 구현

피격 애니메이션은 살아있을 때 && 공격중이지 않을 때 적용

[사용할 에셋]

플레이어 캐릭터 에셋: Casual RPG Character - 04 Avelyn

https://www.assetsready.com/product-page/casual-rpg-character-04-avelyn

 

Casual RPG Character - 04 Avelyn | Assets ready main

Update Ver. 1.1Animations : Characters are humanoid mecanim ready. (See Mixamo motion test) Polys: 2948Verts: 2549Texture: 1024x1024-1, 256x256-1Character Icon: 256x320-1Animations(x8) :(Animation Type_Generic)Sword_F_BattleIdle_01Sword_F_Run_01Sword_F_Att

www.assetsready.com

기본적으로 필요한 모션들이 있고, Mixamo 애니메이션도 추가로 활용 가능, 아이템 변경은 불가능하지만 무기랑 방패는 손에 위치 잘 시키면 가능할 수도 있음.
대기 모션, 사망 모션 Mixamo에서 추가 필요, 일부 애니메이션을 적용해보니 정상적으로 작동했음.

 

몬스터1 에셋: Mini Legion Lich PBR HP Polyart

https://assetstore.unity.com/packages/3d/characters/humanoids/fantasy/mini-legion-lich-pbr-hp-polyart-91497

 

Mini Legion Lich PBR HP Polyart | 캐릭터 | Unity Asset Store

Get the Mini Legion Lich PBR HP Polyart package from Dungeon Mason and speed up your game development process. Find this & other 캐릭터 options on the Unity Asset Store.

assetstore.unity.com

대기, 이동, 공격, 사망 모션이 전부 존재하고, 한 번 다뤄봤기 때문에 구현하기 좋을 것 같다.

 

몬스터2 에셋: Fantasy Monster - Skeleton

https://assetstore.unity.com/packages/3d/characters/humanoids/fantasy-monster-skeleton-35635

 

Fantasy Monster - Skeleton | 3D 휴머노이드 | Unity Asset Store

Elevate your workflow with the Fantasy Monster - Skeleton asset from Teamjoker. Find this & other 휴머노이드 options on the Unity Asset Store.

assetstore.unity.com

Humanoid 적용시 애니메이션이 약간 꼬이긴 하지만 기본적으로 필요한 애니메이션들을 전부 가지고 있기 때문에 큰 문제는 없을 것 같다.

 

환경 에셋: Casual Tiny Environment - Jungle Set

Casual Tiny Environment - Jungle Set | Assets ready main

 

Casual Tiny Environment - Jungle Set | Assets ready main

■ Jungle 1Verts: 19971Tris: 15510Textures :Diffuse map_ 1024x1024-2, 512x512-1Light map_ 1024x1024-1■ Jungle 2Verts: 24777Tris: 13232Textures :Diffuse map_ 1024x1024-2Light map_ 1024x1024-1■ Jungle 3Verts: 21875Tris: 11403Textures :Diffuse map_ 1024x

www.assetsready.com

실제 RPG의 느낌을 주기 위한 배경 에셋도 사용하기로 했다. 크기가 좀 작지만 임의로 넓혀서 사용해도 괜찮을 것 같다.

 

==================================

 

다음으로는 코드의 구조를 계획한 내용이다.

 

==================================

 

카메라 관리

TopDownCamera

 

플레이어 캐릭터 행동 관리
PlayerCharacterController
PlayerStateMachine
State
IdleState_Player, AttackState_Player, MoveToTargetState_Player, DeadState_Player

 

적 캐릭터 행동 관리
EnemyController
EnemyController_Melee
EnemyStateMachine (적의 State를 관리)
State
IdleState_Enemy, AttackState_Enemy, MoveToTargetState_Enemy, MoveToWaypointState_Enemy, DeadState_Enemy


IDamagable, IAttackable(피격, 공격 가능) (플레이어 캐릭터, 적 캐릭터 모두 적용)


인벤토리 관리
PlayerEquipment: 장착한 장비 정보 저장
StaticInventory: 장비창과 같은 고정된 인벤토리 창
DynamicInventory: 아이템이 저장되는 인벤토리 창

InventoryObject: 장비창, 소지품창 같은 인벤토리의 정보를 저장하는 Scriptable 객체
Inventory: 인벤토리의 Slot들을 저장하고 있는 클래스
InventorySlot: 인벤토리 각각의 칸의 슬롯을 관리
InventoryUI: UI를 표시해주며, 이것을 상속받아 StaticInventory, DynamicInventory 구현

ItemObjectDatabase: ItemObject들에 id를 매겨주고 정보를 저장, 관리해주는 Database (ScriptableObject)
ItemObject: 각각의 아이템에 대한 정보 전체를 담고 있는 ScriptableObject
Item: ItemObject의 이름, 능력치, id와 같은 기본적인 정보들을 보관
ItemStat: Item의 능력치의 최소/최댓값을 정하고, 이 값을 결정해주고, 능력치와 값에 대한 정보를 저장

 

=================================================

 

구현할 핵심적인 내용들을 정리해보니 대부분 강의에서 배우고 다루었던 내용들이었다. 그래서 구조도 강의에서 사용했던 구조와 거의 비슷하게 계획하게 된 것 같다. 이렇게 돌아보니 굉장히 알차고 도움이 되는 내용들인 것 같다는 점이 새삼 느껴졌다.

 

오늘 계획은 먼저 기본 프로젝트 세팅과 에셋들을 추가하여 Github에 업로드를 하는 것이다. 이후에는 PlayerCharacter의 움직임을 구현하고, TopDownCamera를 구현할 것이다.

 

내일인 화요일에는 PlayerStateMachine, State, IdleState_Player,  AttackState_Player, MoveToTargetState_Player, DeadState_Player 등 플레이어의 상태를 관리하는 기능을 구현할 것이다.

 

수요일에는 EnemyController, EnemyController_Melee, EnemyStateMachine, State, IdleState_Enemy, AttackState_Enemy, MoveToTargetState_Enemy, MoveToWaypointState_Enemy, DeadState_Enemy 등 적 캐릭터를 구현할 것이다.

 

목요일에는 Item과 Inventory 기능을 구현할 것이다.

 

금요일에는 개발한 내용들을 다듬고, 우선 순위에서 밀린 기능들을 추가로 구현해볼 생각이다.

 

대략적인 일정을 잡았는데, 조금씩 일찍 하거나 늦게 하는 등 약간의 차이는 있을 것 같다. 구현하다보면 생각지 못한 문제를 만나서 시간이 오래 걸릴 수도 있기 마련이기 때문이다. 그래도 한 번 구현해보았던 내용들이기 때문에 이번 주 안에는 마무리를 지을 수 있으면 좋을 것 같다.

+ Recent posts