오늘은 내가 개인적으로 관리하고 있는
유니티용 라이브러리 일부 기능을 소개하려고함.
바로 비주얼 노벨 시스템!
먼저 어떤 기능을 만들기 앞서 그 기능의 핵심을 파악하는게 중요하다고 생각해.
비주얼 노벨의 핵심기능은 뭘까?
1. 클릭을 대기한다.
2. 대사,연출,이미지등 다양한 연출이 재생된다.
3. 클릭을 대기한다.
자잘하게 이것 저것 기능이 많은 비주얼 노벨도 있지만 그건 논외로 치고 일반적으로는 저렇게 기능 정의를 하면 될거야.
그럼 "1.클릭을 대기한다."는 막연하게 생각해도 그냥 클릭만 받으면 되잖아? 쉬운 작업이니 그냥 넘길게.
2번의 "다양한 연출이 재생된다"는 "다양한 기능이 실행된다"라고 생각할 수 있지?
그래 다양한 기능을 미리 정의해놓고 실행시킬 수 있는 디자인패턴을 찾아봤어.
<출처 : 위키백과, 커맨드 패턴 문서>
바로 커맨드 패턴이야.
어떤 기능(또는 요청)을 객체 형태로 캡슐화 해서 사용자의 요청을 나중에 사용할 수 있도록 인스턴스를 만들어 놓는거지.
커맨드패턴은 커맨드,리시버,인보커,클라리언트 4개의 요소로 구성된다는데
이걸 지켜서 구현하는 것 보다 게임을 만드는게 더 중요하기 때문에 핵심부분만 가지고 올거야.
디자인 패턴을 활용할때는 내가 만들고자하는 기능에 적절한지,
억지로 디자인패턴을 사용하려고 하지는 않는지 한번 생각해보고 사용할 필요가 있어.
먼저 추상클래스 Command를 만들었어. UniTask를 사용한건 대사창의 타이핑효과, 배경 페이드 아웃등 여러가지 비동기 연출들을 사용하기 위해서야.
스토리를 재생할때 클릭한번에 여러기능을 재생해줘야하기때문에
Command들을 순차적으로 재생해주는 ChainCommand도 만들었어.
ChainCommand는 앞쪽의 커맨드가 끝나야 바로 다음 커맨드가 실행되기 때문에
효과음 재생이나 캐릭터 이미지 변경등에는 적합하지 않아.
그래서 여러 커맨드를 동시에 실행시키는 GroupCommand도 만들었어.
나는 여기서 게임을 좀 더 편하게 만들기 위해서 오퍼레이터를 재정의해주기도해
좋아 여기까지는 아무런 기능이 없는 설계단계의 커맨드들이였지
이제는 스토리 진행을 위해 다이얼로그 기능을 만들거야.
이름은 간단히 Say로 할게 당연히 Command 클래스를 상속받아야하지.
Say커맨드야.
Excute 메서드 안에서 생성자에서 미리 할당된 _speaker와 _dialog를 사용해서 적절히 연출을 넣어주면 돼.
UI의 경우 생성자에서 컨텍스트를 넘겨줘도 되고 싱글턴 객체에서 가져와도 돼. 적절하게 본인 게임에 맞는 형태로 가면 될 것 같아.
자 그럼 이걸 어떻게 실행시키냐
난 그냥 리스트에 담아서 하나씩 Execute해버려
이런식으로 정의해놓고 시나리오 파일에서 불러와서 Commands에 밀어넣고 하나씩 재생시는 방식이야.
글을 쓰다보니까 List보다는 Queue로 하는게 더 나을지도 모르겠네.
물론 List로 해놓으면 Scenario를 상속받아 간단히 시나리오를 작성할 수도 있어
이 방식은 단기에 빠르게 개발해야할때 내가 모든걸 감당해내면서 개발할때 자주 사용하는 방식이야.
하지만 코드에다가 바로 작성하면 개발자 이외의 팀원이 건드리기 정말 힘들지.
그래서 나는 그래프로 시나리오를 작성할 수 있는 에디터를 만들어서 사용중이야. 이 에디터에 대해서는 기회가 되면 나중에 일지 작성해볼게.
나머지 부분은 클릭할때마다 Scenario의 List에서 인덱스 하나씩 Excute() 호출이 끝이야.
길고 두서없는 글 봐줘서 고마워.
비주얼 노벨 기능 비싸게 유료로 사지말고 본인이 만들어서 써보는건 어때?
ㅇㄷ