Unity/Unity 개발

Unity 2D + Stack 게임 제작 일기(2)

leedh1211 2025. 5. 2. 19:06

이번엔 지난번에 이어서, MainHub에 대해 개발한 내용이다.

MainHub에서는 무기가 나올필요가 없고, NPC와 충돌시, 대화창을 열어 선택지에 따라 대사를 보여주는 느낌으로 가고자했다.

그리고 이 대사 데이터는 Json으로 관리하여 사용하려고 했다.

 

여기서 처음 시간을 많이 뺏긴 오류가 발생하게되었는데

 

 

이런 구조의 Json파일을 읽어오고 category로 대화의 흐름을 관리하고자 했다.

그런데 자꾸 마지막 End대화창에서도 대화가 종료되지않고, 계속 End창이 무한 로딩되는 문제가 발생했다.

여기서 시도해본 방법은

Enum에 [Serializable]을 붙혀도보고, OptionData.Category에도 붙혀보고 JSON의 대소문자까지 하나하나 확인했으나, 원인을 찾지 못했다. 결과적으로 원인은 JSonUtility가 List<OptionData> 내부의 Enum을 파싱하지 못해서 기본값인 Intro만을 불러오고 있었던것이였다.

그래서 결과적으로  NewtonSoft.Json으로 교체하여 진행하니 정상적으로 대화흐름이 종료되었다.

 

그리고 각 NPC별로 다른 대화로직이 필요했기에, 추상클래스를 한번 사용해보기로 했다.

내가 생각한 대화창의 흐름은 아래와 같다

 

DialogueManager에서 Awake시점에 Json파일을 불러와서 대화정보 저장 -> 플레이어가 NPC와 충돌시 DialogueManager에서 StartDialogue를 실행시켜 대화 실행 -> 대화창 UI의 경우 DialogueUI클래스에서 관리하고, DialogueManager에서는 대화의 로직실행과, text를 불러서 UI에 전달 -> UI가 표출 이다. 대화로직의 경우 DialogueFlow 추상 클래스를 만들고, DialogueFlowFactory를 만들어서 각 NPC마다 해당되는 DialogueFlow에 할당해주었다.

 

이렇게 구성된 게임 화면은 아래와 같다.

대장장이는 플레이어 강화 , 건설공은 Stack미니게임 접근, 서기는 현재 최고 기록과, 게임을 초기화할 수 있는 기능을 추가했다.

 

플레이어가 NPC와 충돌한 경우

해당되는 JsonData를 가져와서 옵션버튼을 동적생성하고, 저기서 선택된 값에 따라 연결된 DialogueFlow의 로직에 따라 실행되는 구조이다.