Github 링크(스크립트만 포함)

https://github.com/Mepkatatsu/First_3D_RPG_OnlyScript

 

GitHub - Mepkatatsu/First_3D_RPG_OnlyScript: My First 3D RPG / Script Only

My First 3D RPG / Script Only. Contribute to Mepkatatsu/First_3D_RPG_OnlyScript development by creating an account on GitHub.

github.com

*사용한 리소스의 저작권 등의 문제로 현재 개발한 부분까지의 스크립트만 따로 모아 public으로 업로드 한 Repository의 주소임

전체 기능 영상

구현한 기능

[이동] 00:00 ~ 00:07

화면의 터치한 지점에 생성되는 조이스틱 혹은 키보드 WASD로 이동

 

[카메라] 00:08 ~ 00:20

TopDown 형식의 카메라

휠을 사용한 줌 인/줌 아웃

인벤토리를 열고 닫을 때 빈 공간의 중심에 플레이어 캐릭터가 위치하도록 카메라 위치 변경

 

[특수모션] 00:17 ~ 00:20

플레이어 캐릭터가 10초간 가만히 있으면 특수 모션 재생(2종류의 춤 중에 랜덤으로 재생)

 

[공격] 00:26 ~ 00:44

공격 버튼을 눌러 공격, 1초 이내 입력시 최대 3번까지 연속 공격 실행

 

[적] 00:45 ~ 01:18

적을 클릭하거나 공격하면 타겟으로 지정되며 빨간색 테두리를 추가

정해진 지역 내에서 랜덤 주기로 랜덤한 거리만큼 이동

플레이어에게 선제 공격을 당하면 전투 상태에 돌입

전투 상태에서 플레이어가 공격 사거리 밖에 있으면 플레이어를 추격

플레이어가 지역 밖으로 나가면 원래 위치로 돌아가며 전투 상태 해제

적이 사망하면 자동으로 타겟 해제, 타겟이 변경되면 타겟 상태 유지

 

[인벤토리&아이템] 02:55 ~ 03:30

적을 처치하면 일정 확률로 아이템 획득

일정 확률로 성급 아이템 드랍

성급 아이템 감정

아이템 장착시 빈 공간이 생기면 뒤에 있는 아이템들을 1칸씩 앞으로 이동

인벤토리창 스크롤

 

[기타]

아이템 장착시 스탯 변경되며 공격력이 증가하면 적에게 주는 데미지 증가 03:34, 04:52

플레이어 사망 05:15

 

사용한 에셋

플레이어 캐릭터 에셋: 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

 

몬스터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

 

지형 에셋: Casual Tiny Environment - Jungle Set

https://www.assetsready.com/product-page/casual-tiny-environment-jungle-set

 

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

 

조이스틱 Sprite: Joystick Pack

https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631

 

Joystick Pack | 입출력 관리 | Unity Asset Store

Get the Joystick Pack package from Fenerax Studios and speed up your game development process. Find this & other 입출력 관리 options on the Unity Asset Store.

assetstore.unity.com

 

빌드 후 발생한 오류 수정: Log Viewer

https://assetstore.unity.com/packages/tools/integration/log-viewer-12047

 

Log Viewer | 기능 통합 | Unity Asset Store

Use the Log Viewer from dreammakersgroup on your next project. Find this integration tool & more on the Unity Asset Store.

assetstore.unity.com

 

TextMeshPro

 

+

 

소울게임즈의 루나 모바일 게임 내 UI 및 시스템 사용

https://play.google.com/store/apps/details?id=com.t3.luna&hl=ko&gl=US

 

루나 모바일(12) - Google Play 앱

로맨스 MMORPG 루나 모바일

play.google.com

 

일자별 활동

2023. 04. 04. ~ 2023. 04. 13. : 3D 개발 공부

2023. 04. 14. ~ 2023. 04. 17. : 기능, 구조 계획, 에셋 준비

2023. 04. 18. : 캐릭터 이동, 대기 모션, 카메라 구현

2023. 04. 19. : 캐릭터 공격 모션, 사망 상태 구현

2023. 04. 20. : 적 캐릭터 AI, 전투, 적 캐릭터 필드 구현

2023. 04. 21. ~  2023. 04. 23. : 아이템, 인벤토리 시스템, 스탯 시스템, UI 등 구현

2023. 04. 24. : UI 및 아이템 추가, 빌드, 최종 녹화, 코드 정리 및 구조도 작성

 

 

프로그램 구조도

적 AI 구현: Finite State Machine

적 캐릭터는 StateMachine을 가지며 현재 상태로 CurrentState를 저장합니다. State는 IdleState, MoveToTargetState, MoveToWaypointState, AttackState, DeadState로 총 5종류가 있습니다. 기본적으로 IdleState로 시작하며, 10~30초간 IdleState가 유지되면 Waypoint를 생성하여 MoveToWaypointState로 전환하여 Waypoint로 이동합니다. 적에게 공격을 당하면 전투 상태에 돌입하며, 적이 사거리 내에 없을 경우 MoveToTargetState로 전환하여 적에게 이동하고, 적이 사거리 내에 있을 경우 AttackState에 돌입하여 적을 공격합니다. 각 State가 종료되면 IdleState로 전환됩니다. 적의 체력이 0이 되어 사망하면 DeadState로 넘어가고, 3초 후 GameObject를 Destroy합니다.

 

 

 

아이템 시스템

ItemDatabaseObject와 ItemObejct는 ScriptableObject를 상속하여 구현하였습니다. ItemDatabaseObject는 하나만 존재하고, 이 안에 ItemObject들이 저장되어 있습니다. ItemObject는 아이템을 생성하는 틀이며, 실제 플레이어에게 드롭되는 아이템은 ItemData 형식으로 저장됩니다. itemDatabaseObject에 등록될 때 ItemObject의 ItemData 내의 id가 중복되지 않도록 id를 부여합니다. ItemData에는 ItemStat이라는, 아이템의 능력치 각각의 정보가 저장되어 있습니다. 아이템의 등급, 성급, 강화 수치에 따라 최종 수치가 결정됩니다.

인벤토리 시스템

InventoryObject라는 ScriptableObject가 있으며, 이를 생성하여 플레이어의 장비창과 인벤토리를 구현하였습니다. InventoryObject는 ItemDatabaseObject를 가지며 아이템의 각종 비교에 사용합니다. 또한 하나의 인벤토리 슬롯의 정보를 저장한 InventorySlot을 여러 개 가진 Inventory를 가지고 있습니다. InventorySlot은 해당 슬롯에 저장된 ItemData를 저장합니다. 하나의 InventoryObject는 각각 장비창, 인벤토리 등 하나의 인벤토리 창의 정보를 가지고 있습니다.

 

InventoryUI는 InventoryObject를 가지며 인벤토리에 아이템이 추가되거나 제거될 때 UI를 갱신합니다.

이를 상속받아 구현하는 StaticInventory는 고정적인 인벤토리 창을 갖는 장비창에 등록되는 스크립트로, 등록된 GameObject들인 staticSlots를 InventoryObject의 Inventory 안에 저장된 slots의 slotUI에 순서대로 저장합니다. 마찬가지로 InventoryUI를 상속받아 구현하는 DynamicInventory는 크기가 변하는 인벤토리 창을 갖는 플레이어 인벤토리에 등록되는 스크립트로, 최초에 인벤토리들을 생성하고 아이템을 정렬하는 등의 기능을 수행합니다.

 

스탯 시스템

ScriptableObject인 StatObject를 생성하여 플레이어의 스탯을 관리하는 PlayerStat에 등록하였다. StatObject에는 현재 레벨과 경험치, 체력, 마나, attributes가 저장되어 있습니다. Attribute는 플레이어의 각 스탯들의 타입과 값을 저장합니다. 값은 ModifiableFloat의 형태로 저장되어 있는데, 기본 값인 baseValue에 아이템을 장착할 때마다 스탯별로 modifiers에 IModifier가 추가되어 최종 능력치로 modifiedValue를 반환합니다.

 

 

 

 

 

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

 

 

 

 

 

더보기

3주 전에 느꼈던 것과 마찬가지로 지난 3주간 정말 많은 것들을 배웠다. 3D 개발 관련 강의를 보면서 조금 더 현업에 어울리는 사람으로 성장한 것 같다. 상태 머신과 인벤토리, 아이템 시스템을 만들면서 체계적인 프로그램의 구조와 객체 지향 프로그래밍에 어울리는 방식에 조금 익숙해진 것 같다. 지난 1주일간 개발한 개발물에 부족한 부분과 개선해야할 부분이 아직 많지만, 시간만 들인다면 충분히 해결할 수 있을 것 같다. 3주 전에 취업을 고민했었는데, 3D 개발 공부를 한 것이 아주 좋은 선택이었던 것 같다. 굉장히 힘들고 어려운 시간이었지만 어려움을 극복하면서 많이 성장한 것 같다. 아마 조급함을 느꼈으면 이렇게 성장할 수는 없었을 것이다. 나에게 주어진 시간들에 감사함을 느낀다. 취업을 하게 되면 지금보다도 훨씬 많은 것들을 배울 수 있을 것이다. 지난 2달 간처럼, 앞으로도 많은 것들을 배우고 성장해나갈 것이다.

 

+ Recent posts