개발 관련

Dialogue System for Unity 간단 사용법 및 다국어화 방법1(찍먹)

가야수 2025. 1. 17. 19:19

먼저, 유니티 Asset Store에서 Dialogue System for Unity를 찾아 구매한다. 할인이 없을 경우 85달러나 하기에 비싸기는 하다.

 

유니티 프로그램의 상단 탭 중 Window 탭에서 Package Manager 를 누른 후 Dialogue System for Unity를 찾아 다운로드 및 import 해준다. 

 

Plugins - Pixel Crushers - Dialogue System - Prefabs 에 있는 Dialogue Manager.prefab 을 찾아 드래그 한 후 필요한 씬의 hierarchy 에 넣는다.

그러면 아래와 같이 hierarchy에 되어 있을것이다.

 

hierarchy에 있는 Dialogue Manager 를 클릭한다. 처음 생성했을테니 Initial database가 비어있을테니 create를 눌러 database를 만들어주자.

 

그럼 아래와 같은 창이 뜰 것이다.

 

 

우선 간단하게 캐릭터 이름과 대화만 다국어화 하기 위해 

 

Templates에서 +를 사용해 Actors에서는 Display Name (Text), Display Name en (Localization), Display Name ko (Localization)을 추가해준다.

Dialogue Entries에는 en (Localization), ko (Localization)을 추가해준다.

영어는 en 이고, 한국어는 ko 이다. 언어 코드는 아래 사이트를 참조하여 해당 언어에 맞게 적어야한다.

https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes

 

List of ISO 639 language codes - Wikipedia

From Wikipedia, the free encyclopedia ISO 639 is a standardized nomenclature used to classify languages.[1] Each language is assigned a two-letter (set 1) and three-letter lowercase abbreviation (sets 2–5).[2] Part 1 of the standard, ISO 639-1 defines th

en.wikipedia.org

 

저렇게 바꾼 후, 바로 위 사진 우측 상단에 있는 menu 를 눌러 Apply template to Asset을 눌러 적용해준다.

 

그 후, Actors 탭으로 옮겨 와 + 버튼을 눌러 Player 와 NPC 2개가 있게 추가해주자.

 

그렇게 하여 생성한 Player를 눌러 보면 Inspector에 이렇게 뜨는 걸 확인할 수 있다.

 

만약 아까 Templates 에서 했던 것들을 하지 않았다고 하면 All Fields 에 Display Name, Display Name en, Display Name ko 가 없을 것이다.

 

이제 저 3개의 영역 빈 값에 문자들을 알맞게 채워넣어야 한다.

Display Name은 Default 로 표시되는 문자열이고, 그 외에는 각각의 언어 코드가 설정되었을 때 표시 될 문자열 들이다.

그렇게 Player 와 NPC를 맞게 설정해준다.

 

이제 대화를 만들어보자.

처음에 Conversations 탭에 들어오면 위 사진 처럼 아무것도 없을 것이다.

+를 눌러 대화를 하나 만들어주자.

그럼 저렇게 새 대화가 생성될 것이다.

New Conversation 1 이라고 되어 있는 대화의 이름은 Inspector 탭의 Title을 바꿔서 바꿔주면 된다. 어떤 상황에서의 대화인지 알아보기 쉽게 알맞게 이름을 변경해주자.

Start Node는 Inspector에 설정값을 변경하지 말라고 경고까지 있으니 굳이 바꾸지 말자.

start 노드를 우클릭하고 Create Child Node를 만들어주자.

나는 일단 이렇게 만들었다. 한 노드에서 child node를 2개 만들어 저렇게 하면 player가 선택할 수 있는 분기처럼 된다.

각각의 노드를 누르면 Inspector 창에 이렇게 뜨는데 

저기 부분에서 Actor 부분에 지금 말을 하는 사람을 넣고 Conversant에 그 대화를 듣는 사람을 넣으면 된다.

 

아까 Templates 부분에서 제대로 설정을 하지 않았다면 이 부분에도 en 이랑 ko 부분이 없을 것이다. 

Dialogue Text 부분에 디폴트 값을 넣고 en 과 ko에 각각 언어에 맞게 번역을 하여 넣어주자.

일단 나는 이렇게 만들었다.

그 후 Hierarchy에 있는 Dialogue manager를 눌러 Initial Database에 제대로 내가 만든 대화가 들어가 있는지 확인해보자.

우린 처음에 비어있을 때 저기 부분에서 create를 눌러 만들었기 때문에 이미 연결되어있지만 만약 Project 폴더에서 database를 만들었으면 연결이 안되어있을거기에 저 부분에 넣어주자.

그 다음에 UI를 작성해야하는데 일단은 공부중인 부분이므로 패키지에서 제공되는 기본 UI들 중에 하나 골라서 넣을 것이다.

이 폴더에 여러개가 있지만 Old School UI를 일단 적용해봤다.

해당 폴더에 들어있는 prefab을 드래그한 후, Dialogue Manager의 Inspector에 있는 Dialogue UI에 할당해주면 된다.

그런 다음 Hierarchy에 바닥을 만들고 그 위에 오브젝트를 2개 만들어 RigidBody속성을 넣은 후, 하나는 Player, 다른 하나는 NPC라는 이름으로 바꾸었다. 

Player 오브젝트는 태그를 Player로 바꿔 놓는 것이 중요하다고 할 수 있다.

그 다음, Player 오브젝트에는 간단한 스크립트를 만들어서 움직일 수 있게 하였고, NPC오브젝트에는 Player태그를 가진 오브젝트와 부딪힐 경우 대화가 시작되도록 만들었다.

using PixelCrushers.DialogueSystem;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NPCFuncTistory : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            DialogueManager.StartConversation("대화 테스트");
        }
    }
}

 

코드 전문은 맨 하단에 전부 올려놓겠다.

그렇게 해서 두 오브젝트가 충돌하면 아래와 같이 대화가 나오게 된다.

dialogue_test_test - Tistory - Windows, Mac, Linux - Unity 2022.3.50f1_ _DX11_ 2025-01-17 19-07-12.mp4
3.59MB

 

참고로 Dialogue Manager의 Inspector에 있는 Subtitle Settings 에서 Continue Button 의 속성을 Always로 바꾸면 영상에서처럼 Continue Button 이 생긴다. Never로 하면 NPC의 대화가 바로바로 다음 말로 넘어가진다.

이제 대화 언어를 바꿀 수 있는 버튼을 추가할 것이다.

Hierarchy에 Canvas를 만들어 2개의 버튼을 만들었다.

그 다음 스크립트에 그 버튼이 눌릴 경우 해당 언어에 맞게 Dialogue Manager의 언어를 바꿔주도록 함수를 작성하였다.

private void OnEnable()
{
    enButton.onClick.AddListener(() => ChangeLanguage("en"));
    koButton.onClick.AddListener(() => ChangeLanguage("ko"));
}

private void OnDisable()
{
    enButton.onClick.RemoveAllListeners();
    koButton.onClick.RemoveAllListeners();
}

void ChangeLanguage(string language)
{
    DialogueManager.SetLanguage(language);
}

 

그렇게 해서 대화 중에 버튼을 눌러보면 대화가 한국어 - 영어로 바뀌는 것을 볼 수 있다.

 

dialogue_test_test - Tistory - Windows, Mac, Linux - Unity 2022.3.50f1_ _DX11_ 2025-01-17 19-13-24.mp4
3.86MB

 

대화가 출력되기 이전에 언어를 바꾸는 것은 괜찮은데, 대화가 출력되는 중에 언어를 바꾸면 위 영상처럼 캐릭터 표시명이 이상하게 바뀌는 버그가 있었다. 이것을 찾아봐도 어떻게 고쳐야하는지 알 수가 없었기에, 대화가 출력되는 중에는 언어를 변경하지 못하도록 하는 방법으로 해결하는 것이 어떨까 한다.

 

다음에는 대화가 아닌 버튼에 들어갈 글자 같이 다른 것들을 다국어화 하는 방법에 대해 알아볼 것이다.

 

Player에 할당한 Controller 함수의 전문. 언어변경 버튼에 관한 함수도 같이 있음.

using PixelCrushers.DialogueSystem;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ControllerTistory : MonoBehaviour
{
    public Rigidbody player;
    public float moveSpeed = 5f;
    public Button enButton;
    public Button koButton;

    private void OnEnable()
    {
        enButton.onClick.AddListener(() => ChangeLanguage("en"));
        koButton.onClick.AddListener(() => ChangeLanguage("ko"));
    }

    private void OnDisable()
    {
        enButton.onClick.RemoveAllListeners();
        koButton.onClick.RemoveAllListeners();
    }

    void ChangeLanguage(string language)
    {
        DialogueManager.SetLanguage(language);
    }

    void Update()
    {
        Vector3 moveDirection = Vector3.zero;
        if (Input.GetKey(KeyCode.W))
            moveDirection += Vector3.forward;
        else if (Input.GetKey(KeyCode.A))
            moveDirection += Vector3.left;
        else if (Input.GetKey(KeyCode.D))
            moveDirection += Vector3.right;
        else if (Input.GetKey(KeyCode.S))
            moveDirection += Vector3.back;

        Move(moveDirection);

    }

    private void Move(Vector3 direction)
    {
        player.velocity = direction.normalized * moveSpeed;
    }
}