LambFerret's Blog
건파밍 #5 게임 시스템 (5) : Dialogue System 본문
이번에 소개할 시스템은 Dialogue System. 또 외부 에셋이다.
링크는 여기
Dialogue System for Unity | 행동 AI | Unity Asset Store
Get the Dialogue System for Unity package from Pixel Crushers and speed up your game development process. Find this & other 행동 AI options on the Unity Asset Store.
assetstore.unity.com
우선 외부 에셋을 고르는 기준부터 설명해보자면,
1. 에셋이 없다면 많은 노력이 들어가야함.
2. 하지만 너무 기본적인 기능이라 없으면 게임이 돌아가지를 않음.
3. 이 시스템은 너무 범용적이라서 어디에 어떻게 적용시켜도 작동함.
그래서 결국 선택한 에셋
1. AI 행동 패턴
2. 던전 생성
3. 다이얼로그 (대화)
메이저하게는 이렇게 3가지를 가지고 있다. 이중에서 다이얼로그에 대해 내가 어떻게 이해하고 사용하였는지 설명해보겠다.
우선 설치후 import를 완료하면 이런 창이 뜰 것이다. (안뜬다면 Tools -> Pixel Crushers -> Dialogue System -> Welcome Window)
Help 쪽의 버튼을 누르면 외부 링크로 보내지고, 이제 처음 시작했을때 우리가 해야할껀 Wizards & Resources 의 버튼을 순서대로 눌러보는 것이다.
우선 Dialogue Editor부터 눌러보도록 한다.
일단은 이 탭에서는 할만한게 없다. 비교적 작은 Dialogue 분량을 가지고 있을 것 이므로, 버저닝도 에셋설명도 적지않는다. 이제 첫번째로 눈여겨볼 부분은 마지막탭의 Template.
여기서 각 객체에 대한 필드를 정해준다.
Actor란 대화를 주고 받는 객체 이므로 기본설정으로도 Name, Description, Pictures(Portrait나 등등으로 사용), IsPlayer 정도는 적혀있지만, 원한다면 새로운 필드를 적을 수 있다. 프로젝트 요구사항에 맞도록 설정해주도록하자.
이제 Actors탭을 본다
여기도 간편하게 플레이어를 포함한 등장인물들을 넣으면 된다.
준비는 끝이다! 이제 이 에셋을 작동시킬 Conversations 를 보도록한다.
좌측 상단의 New Conversation 옆의 + 를 누르게 되면 이제 Dialogue Tree를 하나 만들 수 있다. 이제 Player와 Rose의 대화를 간단하게 구현해보도록 하겠다.
Start 노드를 우클릭하면 바로 다음의 노드를 만들 수 있다. 그리고 노드를 더블클릭하면 그 대사를 지정해 줄 수 있다.
이제 여기서 눈여겨 볼 곳이 몇군데 있다.
1. 플레이어의 대사는 파란색 노드, 상대의 대사는 회색 노드이다. 이를 통해 간편하게 누가 말하는지 알 수 있다. 이를 변경하고자 한다면 인스펙터의 Actor와 Conversant를 변경해주면 된다.
2. 한 노드에서 자식노드를 여러개 가지면 자동적으로 선택지가 나오게 된다.
3. 노드를 다시 위에 노드로 연결해서 대화 돌아가기가 가능하다.
이제 한번 확인해보도록 하겠다.
현재 Dialogue UI를 따로 설정하지 않았으므로 이 확인과정은 현재 단계에서는 확인할 수 없지만 일단 잘 나오는지 확인은 해봐야지
DialogueManager.StartConversation("New Conversation 8", transform, player.transform);
Dialogue의 호출은 이 방식으로 할 수 있다. 프로젝트의 코드에서 New Conversation 8 은 위의 그 대화의 이름이고, 2번째 파라미터는 Actor의 Transform, 3번째 파라미터는 Conversant 의 Transform이다.
여기서 파라미터는 사실 대화의 이름만으로 호출 할 수 있다. 이 방법은 후술하도록 하겠다.
이제 다음 단계로, 아까 그 Welcome Window에서 두번째 버튼인 Dialogue Manager Wizard를 설정하자.
UI는 이 에셋을 받으면 Sample로 주는 UI 들이 많이 있다. Prefabs들 중에서 Standard Dialogue UI 로 검색하면 그 대화 UI를 사용할 수 있는데, 이중 하나를 클릭한다. 나의 프로젝트에서는 프로젝트에 적합한 새로운 UI를 만들어서 했다. (위의 대사창처럼)
이후 계속 Next를 누르면서 내게 필요한 옵션들을 클릭한다.
완료가 되면 옆에있는 Player와 NPC 설정 Wizard도 해준다. Player는 플레이어의 프리팹을 넣어서 한번만 해도 되지만, NPC는 NPC의 숫자만큼 해줘야할것이다.
NPC 설정에서 중요한 부분이 하나 있는데,
Actor 에서 Use Dialogue Actor를 설정해주는 것이다.
맨처음에 Actors에 대한 이름들과 설명을 적어 넣어줬을텐데 그 데이터베이스와 이 객체를 연결해주는 곳이다. 나는 이 Prefab을 신참 암매상 (NoobBlackMarketeer) 라고 연결시켜주었다. 이후 Next를 계속눌러 설정이 완료되면
이러한 컴포넌트가 들어가 있는것을 볼 수 있다.
Component들을 직접 넣어주는 방법을 간편하게 할 수 있는 방법이 NPC Setup Wizard를 사용이지만, 이렇게 원하는대로 커스텀하게 컴포넌트를 넣어주는것도 하나의 방법이다.
위에서 DialgueSystem.StartConversation() 의 오버로딩 메소드로 파라미터를 제목 하나만 넣어줄 수 있다고 했다.
그러면 이 에셋에서 그 대화의 정보중 Actor와 Conversant Actor를 읽어서 그 Actor가 어떤이름으로 저장되어있는지 위를 토대로 가져온다. 그러면 굳이 Prefab의 Transform임을 명시하지 않더라도 알 수 있다.
이제 UI를 한번 훑어보자. 아까는 에셋에 포함된 데모 혹은 Example들의 Standard Dialogue UI를 사용한다 라고 했지만, 기성의 UI는 당연히 쓸 수 없으므로 현 프로젝트에서 어떻게 만들었는지 공유하도록 하겠다.
보다시피 우리 대화창은 그 플레이어와 대화대상의 머리 위에 말풍선을 띄운다. 고정된 UI가 아니라 대상쪽으로 위치를 옮겨야 하므로 이 UI가 나타날때 사용하는 클래스를 상속받아 커스텀 클래스를 작성했다.
public class GunfarmingSubtitleUI : StandardUISubtitlePanel
{
protected override void ShowSubtitleNow(Subtitle subtitle)
{
Canvas canvas = GetComponentInParent<Canvas>();
var actor = subtitle.speakerInfo.transform;
var playerTransform = subtitle.listenerInfo.transform;
bool isPlayer = subtitle.speakerInfo.isPlayer;
if (actor != null)
{
ProcessingDialogue dialogueProcessor = actor.GetComponent<ProcessingDialogue>();
if (dialogueProcessor != null)
{
var position = Tool.GetCanvasPosition(dialogueProcessor.GetConversationPosition(), canvas);
panel.position = position; // 패널 위치 설정
}
}
// 창 표시
base.ShowSubtitleNow(subtitle);
}
}
여기서 actor가 말하는 사람(NPC), playerTransform이 Player가 되겠다. 사실 이렇게 안해도 GetComponent<Player>()로 검증하는 방법도 가능하다. 중요한것은, StandardUISubtitlePanel (말풍선) StardardUIMenuPanel (선택지) 등을 상속해서 프로젝트만의 커스텀 대화창을 만들 수 있다.
오늘 소개한 시스템은 비교적 최근에 ( 약 보름전 ) 만들어진 기능이라 소개하기가 쉬웠다. 이렇게 차근차근 하나씩 소개하도록 하겠다.
(제리감사)
'게임 개발 > #2 건파밍 (2D 탑뷰슈터)' 카테고리의 다른 글
건파밍 #4 게임 시스템 (4) : Localization (0) | 2025.01.27 |
---|---|
건파밍 #3 게임 시스템 (3) : Excel to ScriptableObject (1) | 2025.01.21 |
건파밍 #2 게임 시스템 (2) : Data Persistence (0) | 2025.01.18 |
건파밍 #1 게임 시스템 (1) : Singleton, GameManager (0) | 2025.01.18 |
건파밍 #0 개요 (0) | 2025.01.18 |