2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unityで作った自作ゲームの多言語対応

Last updated at Posted at 2023-08-11

ネットの情報を調べてやってみた感じ、思ったより簡単にできそうだったので自分用の備忘としてもまとめておく。
まあググれば普通に出てくる内容です。
パッケージを追加でインストールする必要があるとはいえ、Unity公式が提供している機能だけで完結できるのはやや安心感はあるか。

・この記事を書いた時の実行環境
Unity 2023.2.0(Windows版)

UnityとUnityエディタ上での設定・動作確認

自分で手順をまとめようかとも思ったけど、概ねこちらのサイトで説明されている通りに実施すればいいので省略。
サイト内で説明は無いが、後から他の言語も追加指定できる。
https://robotcoders.net/2022/03/unitylocalization/

ただ、上記サイトの内容だけだとUnityエディタ上でしか言語変更できない。
「この機能を軽く試してみたい」程度ならここまででいいが、他の人に使ってもらう前提のアプリやゲームなら現実的ではない。
なので、実機の画面上から変更できるようにするためにスクリプトは作成しなければならない。

スクリプト側の設定

例として、画面上にドロップダウンを配置し、そこで「日本語」や「英語」を選択できるようにする。
ゲームの設定画面とかでよく見るやつね。

事前にTextを2つCanvas上に配置、それぞれの表示文字を「決定」「キャンセル」とし、TextオブジェクトにはLocalize String Eventを設定しておく。
また、Localization側には各言語の「決定」「キャンセル」に相当する文言設定を済ませておく。

1.スクリプト作成

まずはCreateからC#スクリプトを作成。
内容は下記。
(変数やメソッドの命名はやや適当になってるので適宜いい感じに変更するように)

using System.Threading.Tasks; // ←追加
using UnityEngine;
using UnityEngine.Localization; // ←追加
using UnityEngine.Localization.Settings; // ←追加
using UnityEngine.UI; // ←追加(Legacy版ドロップダウンを使う場合)
using TMPro; // ←追加(TMPro版ドロップダウンを使う場合)

public class ChangeLanguage : MonoBehaviour
{
    [SerializeField] private TMP_Dropdown dropdown_tmp; // 画面上のドロップダウン
    [SerializeField] private Dropdown dropdown_lgc; // 画面上のドロップダウン

    // ドロップダウンの値が変更された時のイベントから呼び出す用
    public void ChangeSelected()
    {
        ChangeLang();
    }

    // 実際に使用言語を変更する処理
    private async Task ChangeLang()
    {
        // このまま使う場合、case内の言語指定とドロップダウン内の項目順は合わせておくこと
        switch (dropdown_tmp.value) // Legacy版ならdropdown_lgc.valueを指定
        {
            case 0: // 日本語
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("ja");
                break;
            case 1: // 英語
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("en");
                break;
            case 2: // 中国語(簡体字)
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("zh-Hans");
                break;
            case 3: // 中国語(繁体字)
                LocalizationSettings.SelectedLocale = Locale.CreateLocale("zh-TW");
                break;
        }
        await LocalizationSettings.InitializationOperation.Task;
    }
}

2.ドロップダウンの配置とスクリプトの設定

スクリプトを保存したら、画面上(Canvas上)にドロップダウンを配置。
そしてドロップダウンのコンポーネントにこのスクリプトをAddする。

3.値取得対象のドロップダウン指定

このスクリプトは対象のドロップダウンをInspector上で設定できるようにしてあるので、このスクリプトをAddしたドロップダウンをdropdown_tmp(もしくはdropdown_lgc)に設定。
※もちろんAwakeやStartメソッドでdropdown_xx = gameObject.GetComponent<XX>();をやって自動取得するようにしても良い。

4.ドロップダウンのイベント設定

次にドロップダウンのOn Value Changedイベントで自身を指定、上記ChangeLanguageのChangeSelected()メソッドを指定する。

5.動作確認

後は実行してドロップダウンを変更し、文言や画像が想定通りに変更されるのを確認する。
(できればビルドして実機でも確認してみよう)
20230811-1.gif
以上。

やってみた感じ

そこまで複雑ではないし、早いうちに使い方を覚えておけば、今後の作品でも気軽に自力である程度は多言語対応できそう。
少なくとも言語ごとに別プロジェクト作って~…とか、専用の複雑なローカライズ機能を別途作って~…みたいな対応はしなくて済むかと。
テキストとかに毎回Localization機能を追加するのは手間だけど、事前にテンプレート(プレハブ)化しておけば多少はその手間も軽減できそうだし…。

参考サイト

https://robotcoders.net/2022/03/unitylocalization/
https://anogame.net/unitypackage_localization/

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?