[UNITY]2DRPG開発日誌 #32 Localization Packageを使った多言語対応

Localization Packageってなに?

Localization Packageは、UNITY公式から提供されているローカライズ支援アセットです。

 

ローカライズとは、言語などをリリースする国によってゲーム内要素を変更することです。

公式から使い方の解説動画が出ていますので時間のある方はこちらもご参照ください。

なお、Localization Packageはプロジェクトにインポートすると削除できないので、試す場合はバックアップを取るかテストプロジェクトにインポートするよう注意してください。

ちなみに

「ローカライズ」は言語だけでなく、画像やデザイン、果てはシステムに至るまで変更する必要がある場合があります。

筆者の知るなかで最も気合いが入ったローカライズは「押忍!闘え!応援団」(ニンテンドーDS)です。ほぼ別作品と思えるほどのローカライズが実装された、良い意味で頭のおかしい作品。

 

導入~基本的な操作手順

1.Package ManagerからImport

2.Localizationフォルダを作成(必須ではないが、生成ファイルが多くなるため)

3.Localization SettingsファイルをCreate

3.Localization Settingsのなかの「Locale Generator」をクリック

4.対応させたい言語を選択して「Generate Locales」。今回はEnglisとJapanese。

5.Window→Asset Managementから「Localization Scene Controls」と「Localization Tables」を表示させる

6.「Localization Tables」のNew Table CollectionからTypeを「String Table Collection」、Nameに好きな名前を入れてCreate。

※UI、セリフ、アイテム名、アイテムの説明文…のように細かく分けると良い感じらしいです。今回は適当に「MyStringTable」。

7.TextMeshProにコンポーネント「Localize String Event」を追加、Table Collectionを先ほど作ったテーブルに設定する。

7.「Localization Scene Controls」の「Track Changes」にチェックして…………ここらへんよくわからないのですが、たぶんさっきのコンポーネント「Localize String Event」のなかの「Add Table Entry」おして、適当に言語を切り替えながらTextMeshProのテキストボックスの中身を書き換える…という感じの操作をします。

8.すると、緑色になる。

9.よく見ると「Game Object Localizer」というコンポーネントが自動で追加されてる。これはGameObject全体の変更を言語ごとに切り替えられる機能。変更箇所が緑色になっていたわけですね。

10.Entry Nameでローカライズ項目の名前、下の「English」「Japanese」の入力欄でそれぞれの変更箇所を編集できるようです。

導入はこんな感じで大丈夫だと思います。

ローカル変数については、ちょっとわからないことが多いので勉強中です…。

CSVにする/CSVを取り込む手順

エクスポート

Localization Tablesタブの右上のおだんごマークをからExport→CSVで吐き出せます。

インポート

先ほどエクスポートしたCSVを適当に編集してみましょう。

3行目にIDを入れていないデータ、

4行目にIDを適当に入れたデータを入力してみます。

インポートはエクスポートと同じ画面から可能です。

インポートしてみたところ、

問題なく登録されました。ただし、IDは空欄でも適当入力でも、自動的に別のIDが割り振られるようです。

さらにCSVを編集してみます。

今度は先ほど追加した3行目、4行目を削除して、

さらに2行目の元々入っていた文章を書き換えてみました。

これでインポートしてみると…

このとおり、元々あったデータは消えません。これはちょっと注意が必要ですね。

あと、謎の空白データが2行追加されています。これは

空白データが入っている(削除できていない)ことが原因なので、インポートの際には注意です。

各オブジェクトにコンポーネントを持たせるのが面倒な場合

オススメの方法ではありませんが、ローカライズのコンポーネントを一つにまとめる方法を解説します。

なぜオススメではないのかというと、この方法だとプレイボタンを押さなければローカライズがうまく作動しているかチェックできないし、あと実際のプロの現場では「面倒でも確実な方法でやる」らしい話を聞いたからです。

まず、次のような状態だとします。

1.UI(Text)の「TestText」を作成し、TestTextScriptをアタッチする。

2.TestTextScriptの中身は、こんな感じにする

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

public class TestTextScript : MonoBehaviour
{
   public TestLocalizeManager testLocalizeManager;
   public static int hensuuint;
   public static string hensuuString;
   string testTextString;

   private void Update()
   {
      Text t = this.GetComponent<Text>();
      t.text = testLocalizeManager.testString1;
   }
}

3.カラのオブジェクト「TestObject」をつくり、TestLocalizeManagerというスクリプトをアタッチし、さらに前述の要領でLocalizeStringEventコンポーネントとGameObjectLocalizerコンポーネントを使って、テーブルに各言語の文章を登録する。

4.TestLocalizeManagerスクリプトの中身は、こんな感じにする(こっちが先かも)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestLocalizeManager : MonoBehaviour
{
   public string testString1;
}

5.GameObjectLocalizerの中身は、とりあえずこんな感じに入力する(試しにローカル変数を使ってみます)

以上により、TestTextの文章は毎フレーム「TestLocalizeManager」の「testString1」の文章が適用される形となりました。

実際に実行してみると…

いい感じですね。

あとは前述の要領でCSVでやりくりすればOKです。