[시리즈] 게임 만들기
· 우여곡절 로그라이크 맵 생성

오늘은 내가 개인적으로 관리하고 있는

유니티용 라이브러리 일부 기능을 소개하려고함. 


바로 비주얼 노벨 시스템!

14


먼저 어떤 기능을 만들기 앞서 그 기능의 핵심을 파악하는게 중요하다고 생각해.

비주얼 노벨의 핵심기능은 뭘까?


1. 클릭을 대기한다.

2. 대사,연출,이미지등 다양한 연출이 재생된다.

3. 클릭을 대기한다.


자잘하게 이것 저것 기능이 많은 비주얼 노벨도 있지만 그건 논외로 치고 일반적으로는 저렇게 기능 정의를 하면 될거야.

그럼 "1.클릭을 대기한다."는 막연하게 생각해도 그냥 클릭만 받으면 되잖아? 쉬운 작업이니 그냥 넘길게.


2번의 "다양한 연출이 재생된다"는 "다양한 기능이 실행된다"라고 생각할 수 있지?


그래 다양한 기능을 미리 정의해놓고 실행시킬 수 있는 디자인패턴을 찾아봤어.


24b0d121e09c28a8699fe8b115ef04699531f5bb

<출처 : 위키백과, 커맨드 패턴 문서>


바로 커맨드 패턴이야. 

어떤 기능(또는 요청)을 객체 형태로 캡슐화 해서 사용자의 요청을 나중에 사용할 수 있도록 인스턴스를 만들어 놓는거지.

커맨드패턴은 커맨드,리시버,인보커,클라리언트 4개의 요소로 구성된다는데

이걸 지켜서 구현하는 것 보다 게임을 만드는게 더 중요하기 때문에 핵심부분만 가지고 올거야.


디자인 패턴을 활용할때는 내가 만들고자하는 기능에 적절한지,

억지로 디자인패턴을 사용하려고 하지는 않는지 한번 생각해보고 사용할 필요가 있어. 



7cf35cfd2159ff6ee54c2afb06df231db5023b285e4b2a662c


먼저 추상클래스 Command를 만들었어.  UniTask를 사용한건 대사창의 타이핑효과, 배경 페이드 아웃등 여러가지 비동기 연출들을 사용하기 위해서야.


스토리를 재생할때 클릭한번에 여러기능을 재생해줘야하기때문에 

Command들을 순차적으로 재생해주는 ChainCommand도 만들었어.


7ff35cf4315ec57ee264123ed119afcec21f3420abe02c869ea16856425cc275


ChainCommand는 앞쪽의 커맨드가 끝나야 바로 다음 커맨드가 실행되기 때문에

효과음 재생이나 캐릭터 이미지 변경등에는 적합하지 않아.


그래서 여러 커맨드를 동시에 실행시키는 GroupCommand도 만들었어.


7ef35af13d59fb7fe264123ed119afcea2c88648e7ef861bc7352220453c536e



나는 여기서 게임을 좀 더 편하게 만들기 위해서 오퍼레이터를 재정의해주기도해

79f35cde215fd57ae57f3e39eb05a9d976d9f68944bd64aedadd8a1ff8a888c16d4b2ddd2f66f3912dd9fc4714bf08c6


좋아 여기까지는 아무런 기능이 없는 설계단계의 커맨드들이였지

이제는 스토리 진행을 위해 다이얼로그 기능을 만들거야.


이름은 간단히 Say로 할게 당연히 Command 클래스를 상속받아야하지.


a15714ab041eb360be3335625683746f01534520d6a6ec89d63766f69e1ccd6e5354918e1398002a3c944ea783


Say커맨드야.

Excute 메서드 안에서 생성자에서 미리 할당된 _speaker와 _dialog를 사용해서 적절히 연출을 넣어주면 돼.

UI의 경우 생성자에서 컨텍스트를 넘겨줘도 되고 싱글턴 객체에서 가져와도 돼. 적절하게 본인 게임에 맞는 형태로 가면 될 것 같아.


자 그럼 이걸 어떻게 실행시키냐

난 그냥 리스트에 담아서 하나씩 Execute해버려


7bf35ccd1959da5ee5791a39ee156a2d579899ccc074f100f47b84cba9


이런식으로 정의해놓고 시나리오 파일에서 불러와서 Commands에 밀어넣고 하나씩 재생시는 방식이야.

글을 쓰다보니까 List보다는 Queue로 하는게 더 나을지도 모르겠네.


물론 List로 해놓으면 Scenario를 상속받아 간단히 시나리오를 작성할 수도 있어


7af35ccd1959da5ee5791a39ee156a2d2bb056a5d3112c1b61dfb7e6ff

이 방식은 단기에 빠르게 개발해야할때 내가 모든걸 감당해내면서 개발할때 자주 사용하는 방식이야.

하지만 코드에다가 바로 작성하면 개발자 이외의 팀원이 건드리기 정말 힘들지.


그래서 나는 그래프로 시나리오를 작성할 수 있는 에디터를 만들어서 사용중이야. 이 에디터에 대해서는 기회가 되면 나중에 일지 작성해볼게.


06bcdb27eae639aa658084e544847464e1e93c0eb30c30ef883b82c5d36abc5ce1577fdf1793beb3fa5c27



나머지 부분은 클릭할때마다 Scenario의 List에서 인덱스 하나씩 Excute() 호출이 끝이야.


길고 두서없는 글 봐줘서 고마워. 

비주얼 노벨 기능 비싸게 유료로 사지말고 본인이 만들어서 써보는건 어때?