개발/개발일지

3D 게임 개발 공부 8 - 중간 마무리 / 인게임 UI, 다이얼로그, 퀘스트, 문, 함정

메피카타츠 2023. 4. 13. 19:35

오늘은 인게임 UI 설정과 다이얼로그, 퀘스트 등의 대화 시스템, 문 함정 등의 레벨 디자인에 대해 배웠다.

그리 새롭거나 어려운 내용은 아니었다. 다이얼로그는 직접 만들어보기도 했었고, UI에서 작동하는 것이다보니 구현이 비슷비슷했다. 다만, 다이얼로그를 저장하고 불러오는 방식에 약간 차이가 있었다. 퀘스트는 아이템과 비슷하게 구현이 되었는데, 이전에 구현했던 기능을 활용해서 구현했기 때문에 그렇게 어렵지는 않은 내용이었다.

문과 함정도 상대적으로 간단하게 구현이 가능했고, 전부 이전에 다뤘던 내용들을 활용한 것이라 오늘 내용들은 전체적으로 어렵지 않은 내용이었다.

 

때문에 오늘은 작성한 스크립트들을 간단하게 정리하는 시간이 될 것 같다.

 

AttributeType: 능력치들의 타입을 저장한 enum이다. 힘, 지능 등 6개의 능력치를 가지고 있다.
ModifiableInt: 능력치들의 각각의 값을 저장하는 클래스이다.
Attribute: AttributeType과 ModifiableInt를 세트로 가져 능력치의 종류와 값을 가지고 있는 클래스이다.
StatsObject: Attribute 배열을 가지고 있어 능력치들에 대한 정보를 저장하게 되는 ScriptableObject이다. 강의에서는 플레이어의 능력치를 저장하는 데에 사용한다.
PlayerStatsUI: 플레이어의 스탯을 스테이터스창에 표시해주며, 아이템을 장착하거나 해제할 때 능력치를 갱신한다.
PlayerInGameUI: 플레이어의 레벨, 체력, 마나 등의 UI를 갱신해준다.

Dialogue: 이야기를 하는 NPC의 이름과 대화 내용 배열을 저장하는 클래스이다.
DialogueManager: 대화 시스템을 관리해주며, 대화의 시작이나 한글자씩 표시해주거나 다음 문장을 나타내주는 등의 기능을 한다.
DialogueNPC: NPC의 컴포넌트에 추가되어 상호작용을 관리해준다.

QuestType: 퀘스트의 타입을 저장한 enum이다. 몬스터를 처치하거나, 아이템을 수집하는 2종류의 타입을 가지고 있다.

QuestStatus: 퀘스트의 현재 상태를 저장한 enum이다. 아무 상태도 아닌지, 수락했는지, 완료했는데, 보상을 받았는지의 상태가 있다.
Quest: 퀘스트의 id, QuestType, 보상 정보 등의 정보를 가지고 있는 클래스이다.
QuestObject: Quest와 QuestType을 한 쌍으로 가지는 ScriptableObject이다. 실제 퀘스트는 이 오브젝트를 통해 만든다.
QuestObjectDatabase: QuestObject가 등록되어 관리할 수 있는 데이터베이스이다.
QuestManager: 아이템을 획득하거나 적을 처치했을 때 QuestManager의 함수를 참조하여 퀘스트의 진행상태를 갱신하고, 완료했으면 완료 상태로 변경해주는 역할을 한다.
QuestNPC: 퀘스트를 주는 NPC에 등록되는 스크립트로, 퀘스트의 정보와 대화 정보를 가지고 있다. DialogueManager를 활용하여 퀘스트 진행 상태에 따라 대화창을 띄워준다.

 

DoorEventObejct: 문이 열리고 닫힐 때 이벤트를 저장하고 처리하는 ScriptableObject이다.

DoorController: 문이 열리고 닫히는 기능이 구현되어있는 스크립트로, DoorEventObject를 통해 이벤트를 처리한다.

DoorTriggerArea: Collider를 활용하여 캐릭터가 Collider에 들어오거나 나갈 때 문을 열고 닫는 기능을 호출한다.

 

TrapController: 함정에 컴포넌트로 추가되는 스크립트로, 데미지를 주는 간격이나 데미지 등의 정보를 가지고 있다. Collider 내에 다른 오브젝트가 들어오면 적에게 피해를 주고, 밖으로 나가면 더이상 피해를 주지 않는다.

 

 

오늘 구현했던 내용은 여기까지다. 구현한 내용 자체는 어렵진 않았지만 이번에도 구조가 약간 복잡한 느낌이 있었다. 이제 내일부터 기획을 세우고 이런 구조를 짜서 기능을 구현할 생각에 약간 부담이 되기는 한다. 여태까지 배운 내용들을 종합해서 필요한 기능들을 나열하고, 이에 알맞은 구조를 짜야겠다.

 

약 9일 간 패스트캠퍼스의 강의를 들으며 3D 게임 개발에 대해서 공부했다. 아주 많이 도움이 되었던 것 같다. 이전에 구현했던 게임의 구조도 개선할 부분이 많다고 느꼈다.

그리고 RegidBody, CharacterController, Nav Mesh Agent, Animation StateMachine, Camera, Lighting, Terrain, Navigation, Finite State Machine, 적 캐릭터의 시야 구현, 전투 시스템 구현, 인벤토리, 아이템 구현, 인게임 UI, 다이얼로그, 퀘스트, 문, 함정 등의 기능들을 구현해보았다. 이전에 다뤄본 기능도 있었지만 대개 처음 다뤄보는 생소한 것이었기 때문에 어려움이 있었다. 이런 어려움을 극복하면서 한층 성장한 것 같다. 그렇지만 아직은 보고 따라하면서 기본적인 방법에 대해서만 배운 것이기 때문에 앞으로 직접 실제 게임을 구현해나가며 나의 능력을 갈고 닦아야겠다.

 

내일부터는 하나의 게임을 분석해서 몇 가지 기능을 추려 구현할 기획을 세워야겠다. 이후에는 그에 맞는 에셋들을 찾아야겠다. 무료 에셋이 있으면 좋겠지만 여의치 않으면 유료 에셋을 구매할 필요도 있을 것 같다. 구현할 기능들의 기획이 완료되면 각 기능들에 대한 구조를 짜야겠다. 구조를 짠 이후에는 배웠던 내용들을 토대로 실제 구현에 들어가겠다. 많은 내용을 구현하지는 않을 것이기 때문에 아마 내일 하루면 구현할 기능의 기획을 세우고, 에셋들을 찾는 단계에 진입할 것 같다. 에셋을 찾고 나서 구조를 짜는 데에는 시간이 조금 걸릴 수도 있을 것 같다. 그래도 하루 정도면 충분할 것 같다. 빠르면 내일, 늦어도 모레에는 개발에 착수하고, 계획을 세워 차근차근 기능을 구현해야겠다. 아마 1주일 이상 걸리지는 않을 것 같기 떄문에 다음 주 중으로 마무리할 수 있을 것 같다. 이를 토대로 포트폴리오를 만들고, 자기소개서 등을 작성해서 지원하면 아마 4월 24일 경이면 지원할 수 있을 것 같다. 빠르면 4월 안으로 결과가 나올 것 같다. 결과가 어떻게 될지는 모르겠지만, 이전에 지원할 때와 비교하면 많이 성장한 것 같다. 그 점만으로도 만족한다. 아마 이번에는 취업에 성공할 수 있을 것 같다. 만약 안 된다면, 이전에 만들던 TSCB를 끝까지 완성할 수도 있을 것 같고, 새로운 게임을 하나 기획해서 출시하는 것을 목표로 할 계획이다.