C#/게임 제작 + TIL

유니티 로컬라이제이션 (1) - UI 상의 적용

Toa_ 2025. 7. 2. 02:27

설정 팝업창

 

 

 

현재 제작 중인 게임의 전체적인 구조는 다 잡힌 상태로, 텍스트 데이터의 관리 및 종류 또한 어느 정도 확립된 상태이다.

따라서 처음 예정했던 영어, 일본어의 언어 지원을 위한 로컬라이제이션 시스템을 적용하고자 한다.

 

여기서 사용할 로컬라이제이션 방식은 유니티에서 지원하는 로컬라이징 패키지를 받아서 사용한다.

 

 

 


 

 

현재 우리 프로젝트에서 로컬라이징을 적용해야하는 부분은 크게 세 가지로 나눌 수 있다.

 

1. 코드상 으로 입력된 값 (하드 코딩)
2. UI, 씬에서 직접 입력된 값
3. CSV 데이터 등을 통해 받아오는 값

 

이렇게 3 분류로 나눴을 때, 각각의 로컬라이징 적용 방식이 아래와 같이 나뉜다.

 

A1. 직접 코드 참조 변경
A2. 유니티에서 지원하는 기능을 사용, 로컬라이제이션 테이블의 Key 값을 사용해 Text 데이터 호출
A3. 별도의 딕셔너리를 제작해 Key 값으로 호출 (이후 자세히 설명)

 

그중 이번 포스팅에서는 UI 상에서의 로컬라이징 적용 방식과 기타 유용한 스크립트를 기록하였다.

 

 

 

 


 

 

 

 

 

 

시작은 당연하지만 유니티 패키지 매니저에서 로컬라이제이션 패키지를 받아주며 시작한다.

 

 

 

 

 

 

이후 Window -> Asset Management -> 로컬라이제이션 테이블 경로로 테이블을 열어준 뒤.

등장하는 New Table Collection 탭에서 Locale Generator로 사용할 언어를 등록해 주면 된다. 해당 프로젝트는 한국어, 영어, 일본어를 사용할 계획이기 때문에 3개를 넣어주면 아래와 같이 나오게 된다.

 

 

언어 3개 등록 (한,영,일)

 

 

 

 

 

 

 

이후 Edit Table Collection 에서, UI 상에 표시될 텍스트 데이터들의 Key 값 + 각 언어별 Key 값 으로 불러올 실제 단어 및 문장을 등록 해 주면 된다.

아래는 실제로 Key와 각 대응 문장을 등록한 모습이다.

 

 

 

 

 


 

 

Localize String Event 컴포넌트

 

 

다음으로 해 줄 것은, 이렇게 Key값과 대응되는 각 언어들을 Key값을 통해 불러올 수 있도록 하는 것이다.

각 UI 들은 TMP 등의 텍스트 형식의 글 표시를 들고 있을 텐데 해당 위치에 "Localize String Event" 컴포넌트를 넣어준다.

 

그리고 String Reference 를 눌러서 해당 UI에 적용시킬 언어의 Key값을 선택해 주고 아래의 Update String에 텍스트 컴포넌트를 끌고 와 넣어주면, 내부의 로케일 값이 바뀔 시 자동으로 표시되는 언어가 바뀔 수 있는 기본 작업이 끝이 난다.

 

 

 


 

 

이제부터가 중요한 부분이다.

내부에서 로케일 값이 변경되어야 UI 상의 텍스트 데이터도 변경되기 때문에, 옵션창의 드롭다운에서 변경할 언어를 선택 시 내부의 로케일 값을 바꿔주는 스크립트를 넣어주어야 한다.

 

 

// 언어 변경 드롭다운 설정
private void InitLocaleDropdown()
{
    localeDropdown.ClearOptions();

    var locales = LocalizationSettings.AvailableLocales.Locales;
    var options = new List<TMP_Dropdown.OptionData>();
    int currentLocaleIndex = 0;

    for (int i = 0; i < locales.Count; i++)
    {
        var locale = locales[i];
        string code = locale.Identifier.Code; // "en", "ko", "ja"

        if (!_localeDisplayNames.TryGetValue(code, out string displayName))
            displayName = locale.LocaleName; // fallback

        options.Add(new TMP_Dropdown.OptionData(displayName));

        if (LocalizationSettings.SelectedLocale == locale)
            currentLocaleIndex = i;
    }

    localeDropdown.AddOptions(options);
    localeDropdown.value = currentLocaleIndex;
    localeDropdown.RefreshShownValue();
    localeDropdown.onValueChanged.AddListener(ChangeLocale);
}
private void ChangeLocale(int index)
{
    //  사용자가 선택한 Locale
    var targetLocale = LocalizationSettings.AvailableLocales.Locales[index];

    // 현재 적용중인 Locale와 비교, 동일한 경우 return
    if (LocalizationSettings.SelectedLocale == targetLocale)
        return;

    if (isChangingLocale) return;
    StartCoroutine(ChangeLocaleCoroutine(index));

}

IEnumerator ChangeLocaleCoroutine(int index)
{
    isChangingLocale = true;

    // 로케일 변경
    yield return LocalizationSettings.InitializationOperation;
    LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[index];

    isChangingLocale = false;

    // 로케일 변경후 텍스트 데이터 업데이트
    DataManager.Instance.InitLocaleText();
}

 

 

 

이렇게 사용하였으며, 여기서 흥미로운 점은 ChangeLocale 메서드에 있는

StartCoroutine(ChangeLocaleCoroutine(index)); 의 로케일 값을 변경하는 과정이 코루틴으로 이루어지는 것이다.

 

 

이것은 LocalizationSettings.InitializationOperation 이 동기 초기화 작업이기 때문에, 즉시 완료되는 것이 아니라 로케일 데이터로드, 리소스 준비, 외부 데이터 읽기 등이 무거운 작업으로.

메인 스레드에서 동기적으로 처리 시 게임이 멈출 수 있기 때문에, 비동기 처리로 로케일 변경을 진행하는 것이다.

 

 

 

 


 

 

 

앞서 설명한 방식대로 드롭다운을 클릭 시 내부에서도 로케일 값이 변경되게 코드를 작성하면.

아래와 같이 변경 시 UI 요소들이 잘 바뀌는 모습을 확인할 수 있다.

 

 

 

 

 

 


 

 

 

 

이어지는 내용

 

유니티 로컬라이제이션 (2) - 트러블 슈팅 (언어별 폰트 변경)

유니티 로컬라이제이션 (1) - UI 상의 적용현재 제작 중인 게임의 전체적인 구조는 다 잡힌 상태로, 텍스트 데이터의 관리 및 종류 또한 어느 정도 확립된 상태이다.따라서 처음 예정했던 영어, 일

toacode.tistory.com