概要
「このゲーム、海外でもリリースしたいな…」そう思ったとき、最初に立ちはだかるのが 多言語対応 です。
本記事はUnity Localization 1.0以降(Unity 2022.3 LTS推奨)を対象としています。
Unity Localizationパッケージ は、Unity公式の多言語対応パッケージです。テキスト、画像、音声、フォントなどを言語ごとに管理し、実行時に切り替えることができます。CSVやGoogle Spreadsheetsとの連携も可能で、翻訳者との協業もスムーズです。
主な概念
| 概念 | 説明 |
|---|---|
| Locale | 言語と地域の組み合わせ(例:en-US、ja-JP) |
| String Table | テキストを言語ごとに管理するコンテナ |
| Asset Table | 画像、音声などを言語ごとに管理するコンテナ |
| Locale Selector | どのLocaleを使用するかを決定する仕組み |
| Smart Strings | 動的に変化する文字列をローカライズする機能 |
インストール
Package Managerからインストールします。
Window > Package Managerを選択- 左上のドロップダウンから
Unity Registryを選択 - リストから
Localizationを見つけて選択 - 右下の
Installボタンをクリック
セットアップ
Localization Settingsの作成
Edit > Project Settings > Localizationを選択Createボタンをクリック- 保存先を選択
Localeの作成
- Localization Settings画面で
Locale Generatorボタンをクリック - 使用する言語にチェックを入れる(例:English、日本語)
Generate Localesボタンをクリック
Locale Selector:起動時の言語選択
Locale Selectorは、アプリ起動時にどの言語を使用するかを決定する仕組みです。
System Language Selectorの設定
端末の言語設定に基づいて自動的に言語を選択します。
Edit > Project Settings > Localizationを開く- Localization Settingsを選択
Locale Selectorsセクションで+をクリックSystem Language Selectorを追加- 優先順位を調整(上から順に評価される)
Startup Selectorsの優先順位
| Selector | 説明 |
|---|---|
| Command Line Selector | コマンドライン引数で言語指定(デバッグ用) |
| System Language Selector | 端末の言語設定を使用 |
| Specific Locale Selector | 特定の言語を固定 |
| PlayerPrefs Selector | ユーザーが選択した言語を保存・復元 |
推奨設定:
PlayerPrefs Selectorを最優先にし、次にSystem Language Selector、最後にSpecific Locale Selector(フォールバック用)の順に設定すると、ユーザー選択 → システム言語 → デフォルト言語 の順で決定されます。
PlayerPrefs Selectorでの言語保存
ユーザーが選択した言語を保存・復元するコード例です。
using UnityEngine;
using UnityEngine.Localization.Settings;
public class LanguageSettings : MonoBehaviour
{
private const string LANGUAGE_KEY = "selected_language";
// 言語を変更して保存
public void SetLanguage(string localeCode)
{
var locale = LocalizationSettings.AvailableLocales.GetLocale(localeCode);
if (locale != null)
{
LocalizationSettings.SelectedLocale = locale;
PlayerPrefs.SetString(LANGUAGE_KEY, localeCode);
PlayerPrefs.Save();
}
}
}
補足:
PlayerPrefs Selectorを使用すると、上記のように保存した言語コードを起動時に自動的に読み込んで適用します。
テキストのローカライズ
String Tableの作成
Window > Asset Management > Localization Tablesを開くNew Table Collectionタブを選択TypeをString Table Collectionに設定Nameにテーブル名を入力(例:UI Texts)Createボタンをクリック
UIテキストのローカライズ
- TextMeshProコンポーネントを持つGameObjectを選択
Add ComponentでLocalize String Eventを追加String Referenceでテーブルとエントリを選択
スクリプトからのローカライズ
using UnityEngine;
using UnityEngine.Localization.Settings;
public class LocalizedTextExample : MonoBehaviour
{
async void Start()
{
try
{
var localizedString = await LocalizationSettings.StringDatabase
.GetLocalizedStringAsync("UI Texts", "menu_start");
Debug.Log(localizedString);
}
catch (System.Exception e)
{
Debug.LogError($"Localization failed: {e.Message}");
}
}
}
async voidの注意:
async voidは例外が呼び出し元に伝播しないため、必ずtry-catchでエラーハンドリングしてください。本格的なプロジェクト ではUniTaskやCoroutineベースの実装を検討してください。
アセットのローカライズ
Asset Tableの作成
Window > Asset Management > Localization Tablesを開くTypeをAsset Table Collectionに設定Nameにテーブル名を入力(例:Game Assets)Createボタンをクリック
Localization Scene Controlsの使用
Window > Asset Management > Localization Scene Controlsを開くAsset Tableに作成したAsset Table Collectionを設定Track Changesをオンにする- シーン内のアセットを各言語ごとに設定
フォントの切り替え
日本語⇔英語など、言語によってフォントを変える必要がある場合はAsset Tableを使用します。
フォントをAsset Tableで管理
- Asset Table Collectionを作成(例:
Fonts) - 各言語にフォントアセットを登録
- TextMeshProの
Localize Font Eventコンポーネントを使用
using UnityEngine;
using UnityEngine.Localization.Components;
using TMPro;
public class LocalizedFontExample : MonoBehaviour
{
[SerializeField] private TMP_Text textComponent;
[SerializeField] private LocalizeAssetEvent fontEvent;
void Start()
{
fontEvent.OnUpdateAsset.AddListener(asset =>
{
if (asset is TMP_FontAsset font)
{
textComponent.font = font;
}
});
}
}
TextMeshPro Fallback Font
CJK(中国語・日本語・韓国語)対応では、Fallback Fontの設定が重要です。
- メインフォントアセットを選択
- Inspectorで
Fallback Font Assetsを開く - 日本語フォントアセットを追加
Font Asset Creator: TextMeshProで日本語フォントを使う場合、
Window > TextMeshPro > Font Asset Creatorで日本語文字を含むFont Assetを作成する必要があります。「Japanese Hiragana + Katakana + CJK」などのプリセットを使用してください。
Smart Strings
動的に変化するテキストをローカライズする機能です。Smart StringsはSmartFormatライブラリに基づいています。
変数の埋め込み
こんにちは、{player_name}さん!
複数形の処理
日本語は複数形の区別がないため、シンプルに変数を埋め込みます。
日本語:
{count}個のアイテム
英語:
{count} {count:plural:item|items}
Smart Stringsの構文はSmartFormatライブラリに準拠しています。言語によって複数形のルールが異なるため、各言語に合わせた設定が必要です。
スクリプトから変数を設定
using UnityEngine;
using UnityEngine.Localization.Components;
public class SmartStringExample : MonoBehaviour
{
[SerializeField] private LocalizeStringEvent localizeStringEvent;
void Start()
{
// Argumentsを使用した変数設定(推奨)
localizeStringEvent.StringReference.Arguments = new object[] { 5 };
localizeStringEvent.RefreshString();
}
}
Smart Stringsの変数:
{0}、{1}の形式で埋め込み、Arguments配列の順序で値が設定されます。名前付き変数を使う場合はLocalizedString.Add()でVariableを追加します。
言語の切り替え
using UnityEngine.Localization.Settings;
public void ChangeToJapanese()
{
var locale = LocalizationSettings.AvailableLocales.GetLocale("ja");
LocalizationSettings.SelectedLocale = locale;
}
非同期での切り替え
IEnumerator Start()
{
yield return LocalizationSettings.InitializationOperation;
ChangeToJapanese();
}
テスト方法
Game Viewでの言語切り替え
- Game Viewの上部ツールバーに
Localeドロップダウンが表示される - クリックして言語を切り替え
- 実行中でもリアルタイムで確認可能
Previewウィンドウ
Window > Asset Management > Localization Tablesを開く- テーブルを選択
- エントリをクリックするとPreviewが表示される
- 各言語の表示を確認
スクリプトからのテスト
#if UNITY_EDITOR
[UnityEditor.MenuItem("Debug/Switch to Japanese")]
static void SwitchToJapanese()
{
var locale = LocalizationSettings.AvailableLocales.GetLocale("ja");
LocalizationSettings.SelectedLocale = locale;
}
[UnityEditor.MenuItem("Debug/Switch to English")]
static void SwitchToEnglish()
{
var locale = LocalizationSettings.AvailableLocales.GetLocale("en");
LocalizationSettings.SelectedLocale = locale;
}
#endif
CSVでの管理
CSVのエクスポート
- Localization Tablesウィンドウでテーブルを選択
- 右上のメニューから
Export > CSV...を選択
CSVのインポート
- Localization Tablesウィンドウでテーブルを選択
- 右上のメニューから
Import > CSV...を選択
Google Spreadsheets連携
Google Spreadsheets Serviceを使用すると、翻訳者との協業がさらにスムーズになります。
セットアップ手順
- Package Managerから
Google Sheets for Unityをインストール(Samples内) - Google Cloud Consoleでサービスアカウントを作成
- JSONキーをダウンロードしてプロジェクトに配置
- Localization Settingsで
Google Sheets Serviceを追加 - 認証情報を設定
詳細: Google Spreadsheets連携の詳細な手順は、Unity公式ドキュメントを参照してください。
Addressables統合
ビルドサイズへの影響
多言語対応を行うと、すべての言語のテキストやアセットがビルドに含まれるため、ビルドサイズが大幅に増加 します。特に以下の場合に顕著です:
- 多数の言語をサポートする場合
- 言語ごとに異なるフォントを使用する場合
- 音声やテクスチャなどの大きなアセットをローカライズする場合
Addressablesと統合することで、この問題を解決できます。 大規模プロジェクトでは、Addressablesと統合することで必要な言語のみをダウンロードできます。
設定方法
- Addressablesパッケージをインストール
- Localization Settingsを開く
Asset DatabaseからAddressablesに変更- 各Localeを個別のAddressableグループに配置
メリット
- ダウンロードサイズ削減: 必要な言語のみをロード
- オンデマンドロード: 言語切り替え時に必要なアセットのみ取得
- リモート配信: CDNからの言語パック配信に対応
まとめ
Unity Localizationパッケージは、Unityプロジェクトを多言語対応するための強力なツールです。
- テキスト、画像、音声のローカライズ - String TableとAsset Tableで管理
- Smart Strings - 動的に変化する文字列も各言語の文法に合わせて自然にローカライズ
- CSV/Google Spreadsheets連携 - 翻訳者との協業がスムーズ
- Addressables統合 - 必要な言語のみをロードしてダウンロードサイズを削減
グローバル市場への展開を考えているなら、ぜひUnity Localizationパッケージを活用してください。