일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 언리얼엔진
- 문자열
- Firebase
- Unity3d
- 이분탐색
- Photon
- 스파르타내일배움캠프TIL
- 유니티
- UE4
- 해시
- Inventory
- UnrealEngine
- 스파르타내일배움캠프
- C++
- 워크플로
- 유클리드호제법
- 내일배움캠프
- Unity
- unityui
- QueryDSL
- 프로그래머스
- 순열
- 알고리즘
- BFS
- 구현
- 포톤
- Unity2D
- FSM
- 스택
- c#
- Today
- Total
개발 낙서장
[Unity 3D] 퀘스트 본문
구현 동기
퀘스트 없는 RPG는 존재하지 않는다.
꼭 위 사진과 같은 형식의 퀘스트가 아니더라도 게임을 진행하는 데에 있어 플레이어가 반드시 해야 하는 행동이나 달성해야 하는 조건 등 또한 퀘스트(혹은 미션)이다.
제 아무리 간단한 게임이라도 게임에 목표가 있으며 목표에 도달하기 위해서는 조건이나 행동들을 만족해야 한다는 것이다.
그래서 나도 간단하게나마 퀘스트를 구현해야겠다고 생각했다.
구현 내용
우선 퀘스트는 정말 여러가지 형태로 만들 수 있는데, 나는 퀘스트를 타입 별로 나누는 식으로 설계했다.
나누는 기준은 퀘스트 달성 조건으로 몬스터를 잡는 헌팅 퀘스트, NPC와 대화하는 대화 퀘스트 두 가지로 구성했다.
정말 간단하게 구상했지만 그래도 들어가는 변수가 꽤 있는데, 변수의 기능은 다음과 같다.
변수 이름 | 형식자 | 내용 |
_questId | int | 퀘스트 고유 Id |
_title | string | 퀘스트 이름 |
_type | Enum | 퀘스트 타입 |
_startNPC | NPC | 시작 NPC |
_desc | string | 퀘스트 설명 |
_dialogues | List | 퀘스트 대화 내용 |
_reward | Reward | 보상 |
_requiredLevel | int | 요구 레벨 |
_precedentQuest | Quest | 선행 퀘스트 |
_isTimeline | bool | 클리어 후 컷신 존재 유무 |
_playableDirector | PlayableDirector | - |
_timeline | TimelineAsset | |
Hunting Quest | ||
_targetMonster | Monster | 대상 몬스터 |
_numberOfHunts | int | 잡아야 하는 수 |
Dialogue Quest | ||
_targetNPC | List | 대화해야 하는 NPC 목록 |
_npcDialogue | List<List> | 각 대상 NPC 별 대화 내용 |
퀘스트의 생성, 삭제, 수정이 편하게 하면서 메모리 사용을 줄이기 위해 Scriptable Object로 만들었는데,
엔진 상에서 간편하게 관리할 수 있지만 퀘스트의 양이 많아질수록 세세한 관리는 어려워지기 때문에 그런 경우에는 Json이나 xml로 관리할 필요가 있어 보인다.
어쨌든 퀘스트는 Scriptable Object로 생성, 관리한다고 하면, 플레이어가 퀘스트를 수락한 이후 따로 관리해야 할 데이터가 필요하다.
(몬스터를 몇마리 처치했는지, NPC 대화 진행도는 어느 정도인지 등)
NPC를 통해 퀘스트를 수락하면 Type에 따라 QuestData를 생성하고 생성된 데이터는 플레이어의 퀘스트를 관리해주는 QuestManager에 들어간다.
퀘스트를 수락하면 QuestData 생성자를 통해 값이 초기화되어 들어가고 NPC와 대화를 한다거나 몬스터를 잡을 때 조건을 확인하여 조건을 충족하면 값이 변경되도록 설계했다.
구현 후기
맨 처음엔 대체 어떻게 퀘스트를 만들어야 할지 전혀 감이 잡히지 않았었다.
사냥 퀘스트, 대화 퀘스트 스크립트를 따로 만들고 거기에 해당하는 사냥 퀘스트 담당 NPC, 대화 퀘스트 담당 NPC도 따로 만들어서 관리했었는데 이렇게 하니까 너무 불편했다.
그래서 C#의 특징인 객체 지향 및 상속성의 장점을 살려 다른 방향으로 다시 구상했다.
퀘스트 시스템을 손보면서 어떻게 해야 데이터를 관리하기 편하게 하고 코드 확장성과 직관성을 좋게 개발할 수 있을지 많이 고민하는 시간이 되었던 것 같다.
'Unity > Devlog' 카테고리의 다른 글
[Unity 3D] NPC 퀘스트 팝업 (0) | 2023.01.16 |
---|---|
[Unity 3D] NPC 대화 (0) | 2023.01.14 |
[Unity 3D] Collider의 크기를 넘겨줄 때 주의사항 (0) | 2023.01.09 |
[Unity 3D] 몬스터 체력바 수정 (0) | 2023.01.06 |
[Unity 3D] 플레이어 스탯 관리 (0) | 2022.05.18 |