【Unity】Unity Localization入門:ゲームを世界中に届けるための多言語対応

作成: 2026-02-05最終更新: 2026-10-10

Unity公式のLocalizationパッケージを使った多言語対応の方法を解説。テキスト、画像、音声のローカライズからSmart Stringsによる動的テキストまで詳しく紹介します。

「このゲーム、海外でもリリースしたいな…」そう思ったとき、最初に立ちはだかるのが 多言語対応 です。if (language == "en")の分岐を全画面に書く未来が見えて、そっと閉じた経験はないでしょうか。

Unity Localizationパッケージ は、Unity公式の多言語対応パッケージです。テキスト、画像、音声、フォントなどを言語ごとに管理し、実行時に切り替えることができます。CSVやGoogle Spreadsheetsとの連携も可能で、翻訳者との協業もスムーズです。

動作確認環境: Unity 6 (6000.x)・Localization 1.5

Localizationのイメージ。地球儀のまわりにいろいろな言語の吹き出しが浮かび、下のスイッチで切り替わる

この記事でわかること

  • Localizationパッケージの基本概念(Locale・String Table・Asset Table)
  • 起動時の言語選択(Locale Selectorの優先順位・PlayerPrefs保存)
  • テキスト・画像・フォントのローカライズ手順
  • Smart Strings(変数埋め込み・複数形)
  • CSV/Google Spreadsheets連携での翻訳ワークフロー

Sponsored

主な概念

概念説明
Locale言語と地域の組み合わせ(例:en-US、ja-JP)
String Tableテキストを言語ごとに管理するコンテナ
Asset Table画像、音声などを言語ごとに管理するコンテナ
Locale SelectorどのLocaleを使用するかを決定する仕組み
Smart Strings動的に変化する文字列をローカライズする機能

肝は「言語ごとの置き換え表」です。テキストはString Table、画像や音はAsset Tableに登録し、UIは表のキーだけを参照します。

Localizationの主な概念の図。ja-JPやen-USのLocaleごとに、String Tableがテキストを、Asset Tableが画像や音声を管理し、ゲーム画面には選択中の言語の内容が届く

インストール

Package Managerからインストールします。

  1. Window > Package Managerを選択(Unity 6.1以降はWindow > Package Management > Package Manager)
  2. 左側の一覧からUnity Registryを選択
  3. リストからLocalizationを見つけて選択
  4. 右下のInstallボタンをクリック

セットアップ

Localization Settingsの作成

  1. Edit > Project Settings > Localizationを選択
  2. Createボタンをクリック
  3. 保存先を選択

Localeの作成

  1. Localization Settings画面でAdd Localeボタンをクリック(古い版ではLocale Generatorという名前でした)
  2. 使用する言語にチェックを入れる(例:English、Japanese)
  3. Add Localesボタンをクリック

Locale Selector:起動時の言語選択

Locale Selectorは、アプリ起動時にどの言語を使用するかを決定する仕組みです。

Player Pref Locale Selectorの追加

新しく作ったLocalization Settingsには、最初からCommand Line Locale Selector→System Locale Selector→Specific Locale Selectorの3つが入っています。端末の言語で始めるだけなら、このままで動きます。プレイヤーが選んだ言語を次回も使うには、Player Pref Locale Selectorを足します。

  1. Edit > Project Settings > Localizationを開く
  2. Locale Selectorsセクションで+をクリック
  3. Player Pref Locale Selectorを追加
  4. ドラッグして一番上へ移動(上から順に評価される)

Startup Selectorsの優先順位

Selector説明
Command Line Locale Selectorコマンドライン引数で言語指定(デバッグ用)
System Locale Selector端末の言語設定を使用
Specific Locale Selector特定の言語を固定
Player Pref Locale Selectorユーザーが選択した言語を保存・復元

推奨設定: Player Pref Locale Selectorを最優先にし、次にSystem Locale Selector、最後にSpecific Locale Selector(フォールバック用)の順に設定すると、ユーザー選択 → システム言語 → デフォルト言語 の順で決定されます。

起動時の言語決定の優先順位フロー。1. Player Pref Locale Selectorで前回選んだ言語があれば決定、2. System Locale Selectorで端末の言語が使えれば決定、3. Specific Locale Selectorで決めておいた既定の言語に決定

Player Pref Locale Selectorでの言語保存

Player Pref Locale Selectorを使っている場合、コードでやることは SelectedLocaleを変更するだけ です。変更するとSelectorが選択を記録し、次回起動時に復元してくれます。

using UnityEngine;
using UnityEngine.Localization.Settings;

public class LanguageSettings : MonoBehaviour
{
    // 言語を変更する(Player Pref Locale Selectorを使っていれば、保存と次回復元は自動)
    public void SetLanguage(string localeCode)
    {
        var locale = LocalizationSettings.AvailableLocales.GetLocale(localeCode);
        if (locale != null)
        {
            LocalizationSettings.SelectedLocale = locale;
        }
    }
}

注意(保存方式は一本化する): Player Pref Locale Selectorはselected-localeというキーで言語を保存しています。ここに加えて自前のPlayerPrefs.SetString("selected_language", ...)のような 別キーの保存を混ぜると、2つの保存値が食い違い、再起動後に意図と違う言語が選ばれる 原因になります。保存はSelectorに一本化し、自前保存はSelectorを使わない場合の代替手段と考えてください。

Sponsored

テキストのローカライズ

String Tableの作成

  1. Window > Asset Management > Localization Tablesを開く
  2. 上部のNew Table Collectionボタンを押す
  3. TypeをString Table Collectionに設定
  4. Nameにテーブル名を入力(例:UI Texts)
  5. Createボタンをクリック

UIテキストのローカライズ

  1. TextMeshProコンポーネントを持つGameObjectを選択
  2. InspectorでTextMeshProコンポーネントの見出しを右クリックし、Localizeを選ぶ(Localize String Eventが追加され、テキストへの接続まで自動で入ります)
  3. String Referenceでテーブルとエントリを選択
TextMeshProの見出しを右クリックしてLocalizeを選ぶと、Localize String Eventが付き、Update Stringからテキストへの接続まで自動で入る図

Add ComponentからLocalize String Eventを手で追加した場合は、Update Stringに対象のTextMeshProを登録してtextを選ぶ必要があります。つながっていないと、言語を替えても表示が変わりません。

スクリプトからのローカライズ

using UnityEngine;
using UnityEngine.Localization.Settings;

public class LocalizedTextExample : MonoBehaviour
{
    async void Start()
    {
        try
        {
            var localizedString = await LocalizationSettings.StringDatabase
                .GetLocalizedStringAsync("UI Texts", "menu_start").Task;
            Debug.Log(localizedString);
        }
        catch (System.Exception e)
        {
            Debug.LogError($"Localization failed: {e.Message}");
        }
    }
}

async voidの注意: async voidは例外が呼び出し元に伝播しないため、必ずtry-catchでエラーハンドリングしてください。本格的なプロジェクトではUniTaskやCoroutineベースの実装を検討してください。

アセットのローカライズ

Asset Tableの作成

  1. Window > Asset Management > Localization Tablesを開く
  2. New Table Collectionボタンを押し、TypeをAsset Table Collectionに設定
  3. Nameにテーブル名を入力(例:Game Assets)
  4. Createボタンをクリック

Localization Scene Controlsの使用

  1. Window > Asset Management > Localization Scene Controlsを開く
  2. Asset Tableに作成したAsset Table Collectionを設定
  3. Track Changesをオンにする
  4. Active Localeで言語を切り替えながら、シーン内のアセットを各言語ごとに設定

フォントの切り替え

日本語⇔英語など、言語によってフォントを変える必要がある場合はAsset Tableを使用します。

フォントをAsset Tableで管理

  1. Asset Table Collectionを作成(例:Fonts)し、エントリ(例:ui_font)を作る
  2. 各言語の欄に、TextMeshProのFont Asset(TMP_FontAsset)を登録
  3. 次のスクリプトで、言語が変わったらフォントを差し替える(TextMeshPro用のフォント切り替えコンポーネントは、標準では入っていません)
using TMPro;
using UnityEngine;
using UnityEngine.Localization;

public class LocalizedFontExample : MonoBehaviour
{
    [SerializeField] private TMP_Text textComponent;
    [SerializeField] private LocalizedAsset<TMP_FontAsset> font = new LocalizedAsset<TMP_FontAsset>(); // Inspectorで Fonts / ui_font を選ぶ

    // 登録すると最初の読み込みが始まり、言語が変わるたびにも呼ばれる
    void OnEnable() => font.AssetChanged += ApplyFont;
    void OnDisable() => font.AssetChanged -= ApplyFont;

    void ApplyFont(TMP_FontAsset value)
    {
        textComponent.font = value;
    }
}

TextMeshPro Fallback Font

CJK(中国語・日本語・韓国語)対応では、Fallback Fontの設定が重要です。

  1. メインフォントアセットを選択
  2. InspectorでFallback Font Assetsを開く
  3. 日本語フォントアセットを追加

Font Asset Creator: TextMeshProで日本語フォントを使う場合、Window > TextMeshPro > Font Asset Creatorで日本語文字を含むFont Assetを作成する必要があります。日本語を含むフォントをSource Font Fileに指定し、Character SetのCharacters from Fileなどで、使う文字を指定して作ります。

Sponsored

Smart Strings

動的に変化するテキストをローカライズする機能です。Smart StringsはSmartFormatライブラリに基づいています。使うエントリは、Localization TablesウィンドウでエントリごとにSmartを有効にします。

変数の埋め込み

こんにちは、{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配列の順序で値が設定されます。上の{count}のような名前付きの変数を使う場合は、localizeStringEvent.StringReference.Add("count", new IntVariable { Value = 5 })のように、名前と値を追加します(IntVariableはUnityEngine.Localization.SmartFormat.PersistentVariablesにあります)。

実践:言語切替ドロップダウンを組む

RPGのオプション画面、パズルゲームの設定、ビジュアルノベルのタイトル——多言語対応ゲームには必ず「言語」ドロップダウンがあります。ここまでの部品(Locale・Player Pref Locale Selector)を、この定番UIに組み上げてみましょう。

言語切替ドロップダウンの実例図。日本語を選ぶと画面がはじめる・やめるの日本語表記に、Englishを選ぶとStart・Quitの英語表記に切り替わる。選択はPlayerPrefsに保存して次回も復元

TMP_Dropdownに利用可能なLocaleを並べ、選択で切り替えます。

using System.Collections;
using UnityEngine;
using UnityEngine.Localization.Settings;
using TMPro;

public class LanguageDropdown : MonoBehaviour
{
    [SerializeField] private TMP_Dropdown dropdown;

    IEnumerator Start()
    {
        // 初期化が終わるまで待つ(起動直後は未初期化のことがある)
        yield return LocalizationSettings.InitializationOperation;

        // 利用可能なLocaleをドロップダウンに並べる
        dropdown.ClearOptions();
        var locales = LocalizationSettings.AvailableLocales.Locales;
        foreach (var locale in locales)
        {
            dropdown.options.Add(new TMP_Dropdown.OptionData(locale.LocaleName));
        }

        // 現在の言語を選択状態にして表示を同期
        dropdown.value = locales.IndexOf(LocalizationSettings.SelectedLocale);
        dropdown.RefreshShownValue();

        // 選択が変わったら言語を切り替える
        dropdown.onValueChanged.AddListener(index =>
        {
            LocalizationSettings.SelectedLocale = locales[index];
            // Player Pref Locale Selectorを設定していれば、選択は自動で保存・復元される
        });
    }
}

ポイントは2つです。

  • 切り替えはSelectedLocaleへの代入1つ: Localize String Eventを使っているテキストは、読み込みが済んだところで画面上のすべてが自動で置き換わります。UIごとに書き換えコードを書く必要はありません。
  • 保存はPlayer Pref Locale Selectorに任せる: Locale Selectorの節でPlayer Pref Locale Selectorを最優先にしてあれば、選択の保存も次回起動時の復元も自動です。自前でPlayerPrefs.SetStringを書くのは、Selectorを使わない場合の代替手段と考えてください。

テスト方法

Game Viewでの言語切り替え

  1. Play中、Game Viewの上部に言語のドロップダウン(Locale Game View Menu)が表示される(出ないときはEdit > Preferences > Localizationで有効か確かめる。ビルドしたゲームには出ません)
  2. クリックして言語を切り替え
  3. 実行中でもリアルタイムで確認可能

Previewウィンドウ

  1. Window > Asset Management > Localization Tablesを開く
  2. テーブルを選択
  3. エントリをクリックするとPreviewが表示される
  4. 各言語の表示を確認

スクリプトからのテスト

#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のエクスポート

  1. Localization Tablesウィンドウでテーブルを選択
  2. ウィンドウ上部のExportメニューからCSV...を選択

CSVのインポート

  1. Localization Tablesウィンドウでテーブルを選択
  2. ウィンドウ上部のImportメニューからCSV...を選択(既存のエントリを残して足すならCSV(Merge)...)
翻訳ワークフローの図。UnityのString TableをCSVでエクスポートして翻訳者に渡し、翻訳後のCSVをインポートして戻す循環

Google Spreadsheets連携

Google Spreadsheets Serviceを使用すると、翻訳者との協業がさらにスムーズになります。

セットアップ手順

Google Sheets連携はLocalizationパッケージに入っているので、別のパッケージは要りません。

  1. Google Cloud ConsoleでGoogle Sheets APIを有効にし、OAuthのクライアントID(デスクトップアプリ)を作る
  2. UnityでAssets > Create > Localization > Google Sheets Serviceを選び、サービスのアセットを作る
  3. 作ったアセットで認証方式にOAuthを選び、クライアントIDの認証情報(JSON)を読み込んでAuthorizeを押す
  4. String Table CollectionのInspectorで、Extensionsの+からGoogle Sheets Extensionを追加し、スプレッドシートを指定してPush/Pullする

重要(認証キーの扱い): OAuthクライアントの認証情報(JSON)は 秘密情報 です。 絶対にGitリポジトリへコミットしないでください(.gitignoreに追加。公開リポジトリでは特に厳禁です)。漏えいするとGoogleアカウントのリソースを第三者に操作されるおそれがあります。

詳細: Google Spreadsheets連携の詳細な手順は、Unity公式ドキュメントを参照してください。

Addressables統合

ビルドサイズへの影響

多言語対応を行うと、すべての言語のテキストやアセットがビルドに含まれるため、ビルドサイズが大幅に増加 します。特に以下の場合に顕著です:

  • 多数の言語をサポートする場合
  • 言語ごとに異なるフォントを使用する場合
  • 音声やテクスチャなどの大きなアセットをローカライズする場合

Localizationパッケージは、最初からAddressablesの上で動いています。 LocaleやString Table・Asset Tableは、作った時点でAddressablesのグループに登録されます。大規模プロジェクトでは、このグループの設定を変えることで、必要な言語だけをダウンロードさせられます。Addressables自体の仕組みは Addressables入門 で解説しています。

設定方法

  1. Window > Asset Management > Addressables > Groupsを開く
  2. 言語ごとのグループ(Localization-String-Tables-のあとに言語名が付いた名前など)を確かめる
  3. 後からダウンロードさせたい言語のグループを、Remote(サーバーから読む設定)に切り替える(リモート配信の記事)

メリット

  • ダウンロードサイズ削減: 必要な言語のみをロード
  • オンデマンドロード: 言語切り替え時に必要なアセットのみ取得
  • リモート配信: CDNからの言語パック配信に対応

まとめ

Unity Localizationパッケージは、Unityプロジェクトを多言語対応するための強力なツールです。

  • テキスト、画像、音声のローカライズ - String TableとAsset Tableで管理
  • Smart Strings - 動的に変化する文字列も各言語の文法に合わせて自然にローカライズ
  • CSV/Google Spreadsheets連携 - 翻訳者との協業がスムーズ
  • Addressables統合 - 必要な言語のみをロードしてダウンロードサイズを削減

グローバル市場への展開を考えているなら、ぜひUnity Localizationパッケージを活用してください。あなたのゲームは、次はどの言語圏のプレイヤーに届けますか?

さらに学ぶために

次に読む次のカテゴリ「ビルド」へ
ビルド

Unityビルド入門:PC、Web、モバイル向けにゲームを書き出す

この記事を読む
Unity このセクションのノート100