자주 사용할 기능들 기록해 둡니다. (게임 대화시스템)
https://prf.hn/click/camref:1100lvE3Z/destination:https://assetstore.unity.com/packages/tools/behavior-ai/dialogue-system-for-unity-11672
Dialogue System for Unity | Behavior AI | Unity Asset Store
Get the Dialogue System for Unity package from Pixel Crushers and speed up your game development process. Find this & other Behavior AI options on the Unity Asset Store.
assetstore.unity.com
유니티 에셋스토어에는 게임을 개발할 때, 아주아주 많이 사용되는, 대화를 위한 시스템을 제공하는 에셋이 판매되고 있는데요.
그 중에서도 가장 많이 애용되고 판매된 에셋 중의 하나가 Dialogue System for Unity 인 것 같네요.
최근에는 대화시스템에 ChatGPT를 도입하는 애드온 에셋도 판매하고 있고요.
저도 그동안의 게임에는 이 에셋을 사용하지 않다가 아무래도 대화UI가 필요한 경영액션 레이싱게임을 만들다보니 필요에 의해서 사용하기 시작해서 이제는 제 필수 에셋이 됐네요.
현재 개발 중인 제 경영액션 레이싱게임에 사용된 사례
https://blog.naver.com/sspsos74/223305863754
[2023. 12. 28] 경영-액션레이싱 게임 - Chase and Destroy it : 인디게임 개발일지 (DevLog) #0004
처음에는 액션이 크게 가미된 톱-다운 레이싱 게임으로 기회되었던 Chase and Destory it 이 었는데요. ...
blog.naver.com
어쨌든 이 에셋을 사용하다보니 정말 엄청나게 많은 기능과 사용 방법 API를 제공하는 것을 알게 되는데, 그러다 보니 너무나 복잡해서 사용할 때 마다 새로 공부하고, 구글링 및 매뉴얼을 공부해야 하더군요.
그래서 이 번 기회에 제가 많이 사용하는 몇 가지 기능만 사용방법을 기록해 놓으려고 이 포스트를 작성합니다.
[간단 사용법]
우선 씬에 Dialogue Manager를 생성해야 하는데, 기본으로 설치되는 경로인 Assets/Plugins/Pixel Crushers/Dialogue System/Prefabs 폴더 안에 보면, DialogueManager 가 프리팹으로 제공되고 있습니다.
간단히 드래그앤드롭으로 씬에 추가해 주면 됩니다.
다음으로 필요한 것은 대화UI인데, 이것도 직접 만들 수도 있지만, 다양한 대화UI를 프리팹으로 제공하고 있습니다.
저는 게임에 맞는 맘에드는 DialogueUI 프리팹을 Canvas 아래에 가져와서, 프리팹을 끊고, 제게 맞게끔 디자인을 좀 변경해서 사용합니다.
Standard UI 만 사용해도 왠만하면 충분하네요.
사용법이 문제가 아니라 실제 사용하게 되면 여러가지 기능이 필요해 지는데, 실제로는 엄청나게 많은 기능이 있는데, 제가 주로 사용하는 몇 가지만 사용방법을 기록해 놓습니다.
Tools>Pixel Crushers>Dialogue System>Dialogue Editor 를 열어서 생성한 Database를 선택하거나 새로 생성해서 여러가지 설정을 할 수 있습니다.
Database 탭에서 Localization Export/Import 부분에 Languages 에 언어들을 추가하면 Conversations 대화 창에 각 언어별로 대사를 지정하게 할 수 있고, 나중에 C# 스크립트에서 설정한 언어의 대사가 출력되게 됩니다.
Conversations탭에서 대사를 만들고 대사진행을 디자인 할 수 있는데, 대사 진행에 있어 조건별로 대사진행이 분기될 수도 있습니다.
제 게임에 사용된 사례인데 위 이미지를 보면 Greet 이후에 1과 2로 분기가 되어 있습니다.
대사 노드를 선택하고 Inspector 창에서 보시면 아래 이미지처럼 Conditions라는 항목이 있습니다.
이 Conditions에 조건을 넣어서 만족하면 이쪽 분기로 실행되도록 만들 수 있는 것이죠.
왼쪽의 노드가(1번) 먼저 조건을 따져보고 만족하면 그대로 실행되지만, 안되면 다음의 노드(2번)의 조건이 맞는지 따져보는 형식으로 되어 있습니다.
이 조건문을 작성하는 방법은 매뉴얼에 나와 있습니다.
https://www.pixelcrushers.com/dialogue_system/manual2x/html/logic_and_lua.html
Dialogue System for Unity: Logic & Lua
Conditions and Script fields in dialogue entries. In [lua(code)] tags within the text of dialogue entries and quest fields (see Markup Tags ). Dialogue System Trigger In your own scripts, using the Lua and/or DialogueLua classes (see How to Use Lua in Your C# Scripts ) The Dialogue Editor's Watches ...
www.pixelcrushers.com
Dialogue System for Unity에서는 내부적으로 Lua라는 언어를 사용하기도 합니다.
위 링크는 이에 대한 매뉴얼 입니다.
Conditions 에 작성할 때는 Actor["Player"].Age > 21 이런 방식입니다.
""안에는 Player 라고 되어 있는데 플레이어도 있고, NPC의 이름도 등록해서 사용할 수 있습니다. 등록은 앞서 봤던 Dialogue Editor의 Actors 탭에서 하시면 됩니다.
어쨌든 위에서 보시면 아시겠지만, 액터중에 Player의 나이가 21 이상이면 실행되는 조건인 것이죠.
age 같은 변수도 등록해서 사용하는 것입니다.
Dialogue Editor에서 Variables 탭에서 변수들을 등록해서 저 위에 제가 사용한 사례를 다시 보면,
Conditions 는 아니고, Script에 사용했지만, Variable["TutorialStep"] = 1; 이라는 부분이 보일 텐데요.
제가 변수(Variable)로 TutorialStep 을 등록해 놓고, 위 처럼 사용한 것입니다.
Conditions는 조건에 맞는지를 체크해서 대사노드를 실행할지 말지를 따지는 것이고, Script는 이 대사노드가 실행되는 동안 실행하게 되는 것입니다.
즉 이 대사를 진행하는 동안 TutorialStep 변수에 1의 값이 들어가는 것이죠.
이렇게 Dialogue System 내에서 각종 변수 Variables 와 Actors, Quests/Items 등을 사용할 수 있습니다.
하지만, 이것들이 C# 스크립트에서 접근가능하고, 변형가능해야 할 필요가 있겠죠.
https://www.pixelcrushers.com/dialogue_system/manual2x/html/scripting.html
Dialogue System for Unity: Scripting
If you do want to use asmdefs, import Plugins/Pixel Crushers/Dialogue System/Scripts/DialogueSystemAssemblyDefinitions.unitypackage. This will import four asmdef files: PixelCrushers , PixelCrushersEditor, DialogueSystem, and DialogueSystemEditor. If you import the Dialogue System asmdefs and enable...
www.pixelcrushers.com
방법은 이 매뉴얼에서 볼 수 있는데, 대표적인 것들을 보면,
DialogueManager.SetLanguage("fr");
로 사용할 언어를 선택한다거나
DialogueManager.StartConversation("Some Conversation", actor.transform, conversant.transform);
이렇게 대화가 실행되도록 하는 스크립트를 사용할 수 있습니다.
DialogueManager.StopConversation();
대화를 멈추는 건 이렇게 하면 되고요.
Dialogue system 변수를 가져오는 C# 스크립트는
string s = DialogueLua.GetVariable("favoriteColor").asString;
이런 방식이고요.
스크립트에서 Dialogue system의 변수에 값을 넣는 스크립트는
DialogueLua.SetVariable("favoriteColor", "blue");
이런 방식 입니다.
다음은 대화 UI에서 typewriter 효과 인데요.
제가 사용한 사례인데, Speaking Text를 선택하고 Inspector에서 아래 이미지 처럼
Unity UI Typewriter Effect 에서 설정을 하거나 없으면 컴포넌트를 추가하면 됩니다.
여기에서 대사가 쓰여지는 속도, 대사가 쓰여지는 동안 나올 사운드 등을 설정할 수 있습니다.
다른 대사효과 에셋인 Super Text Mesh 나 Text Animator for unity 등을 같이 사용하면 재밌는 글자효과나 동적인 이모티콘 등도 만들 수 있습니다.
https://prf.hn/click/camref:1100lvE3Z/destination:https://assetstore.unity.com/packages/tools/gui/super-text-mesh-57995
Super Text Mesh | GUI Tools | Unity Asset Store
Use the Super Text Mesh from KaiClavier on your next project. Find this GUI tool & more on the Unity Asset Store.
assetstore.unity.com
https://prf.hn/click/camref:1100lvE3Z/destination:https://assetstore.unity.com/packages/tools/gui/text-animator-for-unity-254677
Text Animator for Unity | GUI Tools | Unity Asset Store
Use the Text Animator for Unity from Febucci Tools on your next project. Find this GUI tool & more on the Unity Asset Store.
assetstore.unity.com
이런 대사 효과에 대사가 끝났을 때, 뭔가 실행되야 한다거나 하는 등의 필요가 있을 경우가 많습니다.
이걸 가능하게 하는 이벤트가 가능합니다.
다시 위에 제가 사용한 사례인 이미지를 보시면,
세 가지 상태에 따른 이벤트 실행을 가능하게끔 제공하고 있습니다
On Begin () - 대사가 시작되는 순간 실행됩니다. 즉 대사 타이핑이 시작되는 순간이죠.
On Character () - 대사가 타이핑되는 동안 실행되는 이벤트
On End () - 대사 타이핑이 끝나는 순간
저는 이걸 사용해서 대사를 넘기는 버튼이 타이핑이 끝나면 깜빡거리게 하는 기능을 만들 때 사용했습니다.
이 외에도 게임을 만들다보면 필요한 경우가 많아요.
다음으로 대사 중에 어떤 상황이나 값과 같은 변수를 포함해야 하는 경우가 있습니다.
위 이미지를 보시면 제가 개발 중인 러너게임에서 퀘스트를 주는 장면인데, 대사 사이에 기존 기록을 표시해 주기 위해서 기능이 필요했습니다. (빨간색 글씨로 씌여진 부분)
Dialogue system for unity 에서는 이를 위해서 Markup Tags 들을 제공합니다.
위에 제 게임의 대사는 다음과 같이 해서 구현한 것입니다.
목표를 달성해 보세요.
달성하시면 보상을 드립니다.
1. 새로운 기록을 갱신해 보세요. [em2][기존: [var=Current Record]m][/em2]
이전 거리 기록을 새롭게 갱신하세요!
보상 : 150개의 Gem을 드립니다.
보시면 기존 기록 숫자변수가 들어갈 부분이 [var=Current Record] 로 구현되어 있는 것을 보실 수 있습니다.
위 Dialogue system for unity가 제공하는 markup tag를 이용해서 구현한 것이죠.
Current Record는 Dialogue editor에서 Variables 탭에서 추가해 놓고 사용한 것입니다.
또 C#스크립트에서는 해당 이벤트가 발동되는 부분에
DialogueLua.SetVariable("Current Record", _Singleton.Instance.bestRecord[_Singleton.Instance.playerCharacterNumber]);
_Singleton.Instance.bestRecord[_Singleton.Instance.playerCharacterNumber]는 현재 플레이어가 선택한 동물의 최고기록을 담은 변수로 전역적으로 사용하기위해 싱글톤으로 구현되어 있습니다.
일단 여기까지 기록해 놓습니다.