3. Tutorial 시스템 리팩터링 일지 (2)
앞서 이야기를 적은 내용인데, 튜토리얼 시스템에는 크게 Perform 시스템과 Dialog 시스템이 존재한다. Perform의 경우에는 튜토리얼 내부에서만의 사용이 결정되었기에 해당 스크립트를 사용하게 될 프로그래머가 나 혼자일 것이고, 사용 범위가 적으니 크게 부담이 없는 시스템이었다.
하지만, Dialog 시스템은 Perform 시스템과 다르게 게임 전역에서 광범위하게 사용이 될 예정(개발하고 있는 게임이 액션 RPG에 스토리가 있기 때문)이기 때문에 나 말고도 다른 작업자가 사용을 할 수 있다는 점에서 고민이 깊었다.
각자 시스템의 공통 요소를 찾기.
Dialog 시스템에서 사용되는 타입이 4가지가 있었다. 한 마디로 디자인이 다른 4개의 Dialog UI가 있는 것과 마찬가지였다. 타입마다 조금씩 사용되는 기능들이 달랐지만, 겹치는 기능들이 있었다. 원래는 Base 스크립트를 작성해서 억지로 같은 계열로 묶지 않고 A, B, C, D 클래스 4개를 만들어서 분배하는 방법도 고민했었으나, 반복적으로 중복되는 기능을 작성할 것 같아서 다른 방법이 있을까 살펴봤다.
Dialog 시스템에서 공통적으로 사용되는 기능들은 텍스트 표시, 텍스트 전부 출력 시 버튼 클릭을 통한 다음 텍스트 표시가 있었고 Dialog 시스템 클래스에서 Text 변수를 설정하고 동일한 Dialog Data를 받아서 전달한다면 중복되는 리소스를 최소화 할 수 있을 것 같다는 생각이 들었다.
그러면 어떤 방법으로 하는게 좋을까.
어떻게 해야지 의도를 전달할 수 있을까?
소속 팀의 인원은 총 20명으로 그 중에서 프로그래머는 4명이다. 몬스터와 플레이어을 담당하는 프로그래머쪽에서도 Dialog의 사용 가능성이 있고 특히, 연출 쪽을 담당하는 프로그래머 쪽에서는 Dialog 시스템 사용이 확실시 되는 상황이므로, 용이한 이용이 가능해야했다.
또, 대면으로 만나서 의도를 설명하는 일을 최소화 해야겠다고 생각했다.
초반 작업에서는 Dialog Type이 변경될 때 마다, Type에 맞는 Script를 붙여줌으로서 다른 작업자가 헷갈릴 수 있는 여지들을 최소화 하였으나, 이 경우로 계속 진행할 경우 발생하는 문제가 하나 있었다.
전에 위에서 언급했던 중복되는 기능들을 구현해야하는 일이 생길 것 같았고, 이 상태에서 기능 단위로 클래스 구현을 할 경우, Type별로 구현된 UIDialogController에서 호출되는 클래스들을 정리하기 힘들 것 같단 생각도 있었다.
위 방식을 그대로 구현했던 것이 UIDialogController에서는 Text 오브젝트를 추가해서 타이핑 효과나, 텍스트에 관련된 기능을 가지고 있고, Dialog 시스템은 총 4개의 타입(Normal, CutScene, Standing, Range)이 있는데 각각 UINormalDialog, UICutSceneDialog, UIStandingDialog, UIRangeDialog 클래스를 만들어서 Enum이 변경될 때마다 Enum에 맞는 클래스를추가해주는 방법이었다.
만들고 싶었던 것을 만들어보자.
하지만 앞서 말했던 것 처럼 Type별로 클래스를 만들었을 때, 중복되는 기능을 구현해야 하는 일이 생겼고 이를 해결하기 위해서 기능 단위로 클래스 구현을 하기로 했다. 하루 동안 더 나은 방법이 있을지 고민을 해봤지만, 내가 생각하는 한계로는 해당 방법이 가장 좋을 것 같다는 생각이 들었고, 고민만 하다가 가장 중요한 구현을 소흘히 할 것 같다는 생각에 일단 구현 해보고 생각하기로 했다.
결론적으로는 내가 만들고 싶었던 대로 만들었다. 기존에 Enum의 Value에 따라서 컴포넌트가 변경되는 기능을 구현해보고 싶었는데 이번 기회에 구현을 했고, 기능들은 내부적으로 UI Dialog Controller에서 Dialog Data가 변경될 때 실행되는 Event를 구독하며 데이터를 가져오게 했다.
기능들은 Dialog 시스템에서 공통적으로 사용되는 부분을 제외한 나머지를 가지고 나눴고, 다음과 같다.
▶ UIDialogImageChanger : Data에 해당하는 Image를 표시한다.
▶ UIDialogDistance : 기본적으로 DialogSystem은 다른 스크립트를 통해 실행이 가능하나, 일정 거리 안에 들어갔을 경우에 실행하게 한다.
▶ UIDialogPass : Text가 모두 표출되지 않았을 경우에는 Text를 바로 표출하게 하며, 모두 표출된 상태에서는 다음 Text를 출력한다.
▶ UIDialogSkip : 해당 대화를 전부 스킵한다.
▶ UIDialogNpcNameViewer : Data에 해당하는 NPC Name을 표시한다.
그리고 데이터를 설정하는 과정에서 무거울 경우에 생기는 문제들을 대비해서 Dialog의 상태를 4단계로 구분해서 실행하게 만들었다. SetDialogData() 메서드를 통해서 Dialog Data를 미리 Canvas에 배치하고 ShowDialog()를 통해서 Empty 상태의 Dialog UI를 띄운다.
이후에는 PlayDialog()를 통해서 Dialog를 실행할 수 있다. 정확히는 PlayDialog()로 실행을 하고 이후에는 OnNextDialog()를 통해서 사용이 가능한데, 이 부분은 너무 번잡한 것 같아서 3단계로 감량할 수 있는 구조를 고민하고 있다.
일단... 지금 구현하고 있는 UI 관련 스크립트부터 완성해야겠지만...
'개발 일지 > 퓨처리티' 카테고리의 다른 글
2. Tutorial 시스템 리팩터링 일지 (1) (0) | 2023.09.04 |
---|---|
1. 졸업 작품을 진행하면서 (0) | 2023.06.19 |