본문 바로가기
디지털노마드

챗GPT 게임개발70: Unity에서 다국어 지원과 언어별 폰트 적용하기

by 인텔리노마드라이프 2024. 12. 2.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

 

이번 시간에는 Unity에서 **로컬라이제이션(Localization)**을 활용하여 다국어 UI를 구현하고, 각 언어에 맞는 폰트를 적용하는 방법을 알아보겠습니다. 특히 AvatarDefault 스크립트를 중심으로, 텍스트를 로컬라이즈하고 언어별로 폰트를 동적으로 변경하는 방법을 소개해 드릴게요.

 

이 스크립트를 통해 게임 내에서 여러 언어를 지원하고, 사용자에게 최적화된 UI 경험을 제공할 수 있습니다. 단계별로 필요한 코드와 설명을 함께 제공하니, 프로젝트에서 바로 적용해 보세요.

 


 

신개념 메모리 게임의 탄생. 외워라! 창고.

2024.11.14 - [분류 전체보기] - [외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!

 

[외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!

안녕하세요, 인텔리원스튜디오(IntelliOneStudio)에서 흥미진진한 소식을 가지고 왔어요! 저희가 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다! 이 게임은 챗GPT의 놀라운 AI 기능을

intellinomadlife.tistory.com

 

창고에 물건을 보관하면 더이상 보여주지 않고, 오로지 당신의 기억력으로 찾아야해요.

날이 갈수록 늘어나는 상품들과 주문에도 정확하고 빠르게 물건을 찾아 배송해야해요.

과연 당신은 며칠까지 버틸수 있을까요?

당신의 기억력을 시험해봐요. 지금 다운로드하세요.

 

[아이폰 앱스토어 다운로드]

https://apps.apple.com/kr/app/%EC%99%B8%EC%9B%8C%EB%9D%BC%EC%B0%BD%EA%B3%A0/id6737766088

 

‎외워라창고

‎환영합니다. 우리 창고는 매일 새롭게 들어오는 상품을 각기 다른 각기 다른 상자에 보관해요. 주문이 들어오면 그 상품들을 찾아 포장하고, 정확한 주소로 배송하는 것이 여러분의 임무입니

apps.apple.com

 


 

저희가 챗GPT를 활용해서 개발한 첫 번째 게임을 여러분께 소개합니다! 이 게임은 챗GPT의 놀라운 AI 기능을 활용해 개발했어요. 즐거움이 가득한 이번 게임은, 챗GPT를 활용해서 누구든지 게임을 재미있게 만들 수 있다는 것을 보여줄 거에요.

 

* APP Store 에서 다운로드 

https://apps.apple.com/kr/app/%EB%86%8D%EB%B6%80%EC%9D%98-%EA%BF%88/id6479183930

 

‎농부의 꿈

‎오래된 전설이 숨겨져 있는 [농부의 꿈]목장 한구석에서 ‘비밀의 문'과 '마법 책'이 발견되었어요. [변신하는 동물들] 병아리가 합쳐져 닭이 되고, 닭이 합쳐져 고슴도치로 변신하며, 점점 더

apps.apple.com

 

 

*Google Play 에서 다운로드

https://play.google.com/store/apps/details?id=com.intellione.farmersfirstdream&pcampaignid=web_share

 

농부의 꿈 - Google Play 앱

평화로운 목장에서 신나는 동물 합치기 무료게임 (바람, 뚫어뻥, 밧줄, 무중력 등 매직 아이템 활용해 병아리를 젖소로 키워보세요.)

play.google.com

 


주요 기능 소개

 

로컬라이즈된 텍스트 설정 및 업데이트

  • LocalizedString을 사용하여 텍스트를 로컬라이즈합니다.
  • 로케일 변경 시 자동으로 텍스트를 업데이트합니다.

 

언어별 폰트 동적 적용

  • 현재 선택된 로케일에 따라 적절한 폰트를 동적으로 적용합니다.
  • 각 언어에 맞는 폰트를 사용하여 UI의 일관성을 유지합니다.

 

로케일 변경 이벤트 처리

  • 로케일이 변경될 때 이벤트를 받아 텍스트와 폰트를 업데이트합니다.
  • 사용자에게 즉각적인 변화를 제공합니다.

 


 

아래와 같이 ChatGPT에게 질문했어요.

※ ChatGPT 답변 내용 중 제가 별도로 표시한 굵은 글씨를 기준으로 읽으시면 좀 더 이해가 쉽게 될 거예요.


 

[질문]

안녕, ChatGPT. Unity에서 다국어 지원을 위해 텍스트를 로컬라이즈하고, 각 언어별로 폰트를 적용하고 싶어. AvatarDefault 스크립트를 작성했는데, 어떻게 동작하는지 자세히 설명해 줄 수 있어?


 

 

[답변]

안녕하세요! AvatarDefault 스크립트를 통해 Unity에서 다국어 지원과 언어별 폰트 적용을 구현하는 방법을 단계별로 설명해 드릴게요.

 

1. 로컬라이즈된 텍스트 설정 및 초기화

 

설명:

  • 텍스트 UI 요소와 로컬라이즈된 문자열을 설정합니다.
[SerializeField] private TextMeshProUGUI localizedText;
[SerializeField] private LocalizedString localizedTextString;
  • Start() 메서드에서 로컬라이즈된 텍스트를 가져와서 UI에 적용합니다.
private void Start()
{
    // 로컬라이즈된 텍스트 설정 및 폰트 적용
    localizedTextString.GetLocalizedStringAsync().Completed += handle =>
    {
        if (localizedText != null)
        {
            localizedText.text = handle.Result;
            ApplyLocalizedFont(localizedText);
        }
    };

    // 로케일 변경 이벤트 구독
    LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged;
}
  • GetLocalizedStringAsync()를 사용하여 비동기로 로컬라이즈된 텍스트를 가져오고, 완료되면 UI 텍스트에 적용합니다.
  • 폰트 적용을 위해 ApplyLocalizedFont() 메서드를 호출합니다.

 

2. 로케일 변경 시 텍스트 및 폰트 업데이트

 

설명:

  • 로케일이 변경될 때 호출되는 이벤트 핸들러를 구현합니다.
private void OnLocaleChanged(Locale newLocale)
{
    // 로케일이 변경되면 텍스트와 폰트를 업데이트
    localizedTextString.GetLocalizedStringAsync().Completed += handle =>
    {
        if (localizedText != null)
        {
            localizedText.text = handle.Result;
            ApplyLocalizedFont(localizedText);
        }
    };
}

 

  • LocalizationSettings.SelectedLocaleChanged 이벤트에 핸들러를 등록하여, 로케일이 변경될 때마다 텍스트와 폰트를 업데이트합니다.

 

3. 언어별 폰트 동적 적용

 

설명:

  • 현재 선택된 로케일에 따라 적절한 폰트를 적용하는 메서드를 구현합니다.
private void ApplyLocalizedFont(TextMeshProUGUI textElement)
{
    TMP_FontAsset selectedFont = null;
    string currentLocale = LocalizationSettings.SelectedLocale.Identifier.Code;

    if (currentLocale == "ko")
    {
        selectedFont = koreanFont;
    }
    else if (currentLocale == "ja")
    {
        selectedFont = japaneseFont;
    }
    else
    {
        selectedFont = englishFont;
    }

    // 폰트가 설정되면 적용
    if (selectedFont != null)
    {
        textElement.font = selectedFont;
    }
    else
    {
        Debug.LogWarning("폰트가 설정되지 않았습니다.");
    }
}

 

 

  • 로케일 코드에 따라 폰트를 선택합니다.
    • "ko"이면 koreanFont를 적용합니다.
    • "ja"이면 japaneseFont를 적용합니다.
    • 그 외에는 englishFont를 기본으로 사용합니다.
  • 선택된 폰트를 텍스트 요소에 적용하여 언어별로 적절한 글꼴이 표시되도록 합니다.

전체 코드 구조

AvatarDefault 클래스는 Unity의 MonoBehaviour를 상속하며, TextMeshProUGUI 텍스트 요소와 로컬라이즈된 문자열, 그리고 언어별 폰트를 다룹니다. 주요 메서드는 Start(), OnLocaleChanged(), ApplyLocalizedFont()입니다.

 

using TMPro;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

namespace WarehouseDeliveryQuest.UI
{
    public class AvatarDefault : MonoBehaviour
    {
        // 로컬라이즈 텍스트 UI 요소
        [SerializeField] private TextMeshProUGUI localizedText;

        // 로컬라이즈된 텍스트 필드
        [SerializeField] private LocalizedString localizedTextString;

        // 폰트 설정을 위한 변수
        [SerializeField] private TMP_FontAsset koreanFont;
        [SerializeField] private TMP_FontAsset englishFont;
        [SerializeField] private TMP_FontAsset japaneseFont;

        private void Start()
        {
            // 로컬라이즈된 텍스트 설정 및 폰트 적용
            localizedTextString.GetLocalizedStringAsync().Completed += handle =>
            {
                if (localizedText != null)
                {
                    localizedText.text = handle.Result;
                    ApplyLocalizedFont(localizedText);
                }
            };

            // 로케일 변경 이벤트 구독
            LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged;

        }

        // 로케일 변경 시 호출되는 메서드
        private void OnLocaleChanged(Locale newLocale)
        {
            // 로케일이 변경되면 텍스트와 폰트를 업데이트
            localizedTextString.GetLocalizedStringAsync().Completed += handle =>
            {
                if (localizedText != null)
                {
                    localizedText.text = handle.Result;
                    ApplyLocalizedFont(localizedText);
                }
            };
        }

        // 텍스트에 로컬라이즈된 폰트를 적용하는 메서드
        private void ApplyLocalizedFont(TextMeshProUGUI textElement)
        {
            TMP_FontAsset selectedFont = null;
            string currentLocale = LocalizationSettings.SelectedLocale.Identifier.Code;

            if (currentLocale == "ko")
            {
                selectedFont = koreanFont;
            }
            else if (currentLocale == "ja")
            {
                selectedFont = japaneseFont;
            }
            else
            {
                selectedFont = englishFont;
            }

            // 폰트가 설정되면 적용
            if (selectedFont != null)
            {
                textElement.font = selectedFont;
            }
            else
            {
                // Debug.LogWarning("폰트가 설정되지 않았습니다.");
            }
        }
    }
}

 

 

 


 

[추가 질문]

그렇다면, 이 스크립트를 실제 프로젝트에 적용하려면 어떻게 해야 할까?


 

[답변]

좋은 질문이에요! 이 스크립트를 프로젝트에 적용하는 방법을 알려드릴게요.

 

1. 필요한 패키지 설치

  • Unity Localization 패키지를 설치해야 합니다.
    • Unity 패키지 매니저에서 Localization 패키지를 검색하여 설치하세요.

2. 폰트 에셋 준비

  • 각 언어별로 지원하는 폰트를 준비합니다.
    • 예를 들어, 한국어, 영어, 일본어 폰트를 각각 TMP_FontAsset 형태로 준비합니다.
    • TextMeshPro의 Font Asset Creator를 사용하여 폰트를 생성할 수 있습니다.

3. 로컬라이제이션 테이블 설정

  • String Table을 생성하여 각 언어별로 텍스트를 설정합니다.
    • "LocalizedTextString"으로 사용할 키를 생성하고, 각 언어에 맞는 텍스트를 입력합니다.

4. 스크립트 설정

  • AvatarDefault 스크립트를 생성하고, 위에서 설명한 코드를 작성합니다.
  • 스크립트의 인스펙터에서 다음 항목을 설정합니다:
    • Localized Text: 로컬라이즈된 텍스트를 표시할 TextMeshProUGUI 요소
    • Localized Text String: 로컬라이즈된 문자열 (LocalizedString)
      • 이때, String Table과 키를 선택합니다.
    • Korean Font, English Font, Japanese Font: 각 언어별로 사용할 폰트 에셋

5. 테스트 및 확인

  • 게임을 실행하고, 로케일을 변경하여 텍스트와 폰트가 올바르게 변경되는지 확인합니다.
  • 로케일 변경은 코드에서 또는 UI를 통해 구현할 수 있습니다.

 

오늘은 Unity에서 로컬라이제이션을 활용하여 다국어 지원과 언어별 폰트 적용을 구현하는 방법을 알아봤어요.

 

AvatarDefault 스크립트를 통해 사용자에게 최적화된 UI 경험을 제공할 수 있습니다.

이 시스템을 통해 글로벌 플레이어들에게 보다 직관적이고 매끄러운 UI를 제공하여 게임의 완성도를 높일 수 있습니다.

 

지금까지 인텔리원스튜디오(IntelliOneStudio)였습니다!

감사합니다.

728x90