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

作成: 2026-02-05最終更新: 2026-07-13

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

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

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

本記事はUnity Localization 1.0以降(Unity 2022.3 LTS推奨)を対象としています。

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を選択
  2. 左上のドロップダウンからUnity Registryを選択
  3. リストからLocalizationを見つけて選択
  4. 右下のInstallボタンをクリック

セットアップ

Localization Settingsの作成

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

Localeの作成

  1. Localization Settings画面でLocale Generatorボタンをクリック
  2. 使用する言語にチェックを入れる(例:English、日本語)
  3. Generate Localesボタンをクリック

Locale Selector:起動時の言語選択

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

System Language Selectorの設定

端末の言語設定に基づいて自動的に言語を選択します。

  1. Edit > Project Settings > Localizationを開く
  2. Localization Settingsを選択
  3. Locale Selectorsセクションで+をクリック
  4. System Language Selectorを追加
  5. 優先順位を調整(上から順に評価される)

Startup Selectorsの優先順位

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

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

起動時の言語決定の優先順位フロー。1. PlayerPrefs Selectorでユーザーが選んだ言語があれば決定、2. System Language Selectorで端末の言語、3. Specific Locale Selectorでデフォルト言語に決定

PlayerPrefs Selectorでの言語保存

PlayerPrefs Selectorを使っている場合、コードでやることは SelectedLocaleを変更するだけ です。変更した時点でSelectorが自動的に保存し、次回起動時にも復元してくれます。

using UnityEngine;
using UnityEngine.Localization.Settings;

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

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

Sponsored

テキストのローカライズ

String Tableの作成

  1. Window > Asset Management > Localization Tablesを開く
  2. New Table Collectionタブを選択
  3. TypeString Table Collectionに設定
  4. Nameにテーブル名を入力(例:UI Texts
  5. Createボタンをクリック

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

  1. TextMeshProコンポーネントを持つGameObjectを選択
  2. Add ComponentLocalize String Eventを追加
  3. 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でエラーハンドリングしてください。本格的なプロジェクトではUniTaskCoroutineベースの実装を検討してください。

アセットのローカライズ

Asset Tableの作成

  1. Window > Asset Management > Localization Tablesを開く
  2. TypeAsset 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. シーン内のアセットを各言語ごとに設定

フォントの切り替え

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

フォントをAsset Tableで管理

  1. Asset Table Collectionを作成(例:Fonts
  2. 各言語にフォントアセットを登録
  3. 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の設定が重要です。

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

Font Asset Creator: TextMeshProで日本語フォントを使う場合、Window > TextMeshPro > Font Asset Creatorで日本語文字を含むFont Assetを作成する必要があります。「Japanese Hiragana + Katakana + CJK」などのプリセットを使用してください。

Sponsored

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を追加します。

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

RPGのオプション画面、パズルゲームの設定、ビジュアルノベルのタイトル——多言語対応ゲームには必ず「言語」ドロップダウンがあります。ここまでの部品(Locale・PlayerPrefs 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];
            // PlayerPrefs Selectorを設定していれば、選択は自動で保存・復元される
        });
    }
}

ポイントは2つです。

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

テスト方法

Game Viewでの言語切り替え

  1. Game Viewの上部ツールバーにLocaleドロップダウンが表示される
  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...を選択
翻訳ワークフローの図。UnityのString TableをCSVでエクスポートして翻訳者に渡し、翻訳後のCSVをインポートして戻す循環

Google Spreadsheets連携

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

セットアップ手順

  1. Package ManagerからGoogle Sheets for Unityをインストール(Samples内)
  2. Google Cloud Consoleでサービスアカウントを作成
  3. JSONキーをダウンロードしてプロジェクトに配置
  4. Localization SettingsでGoogle Sheets Serviceを追加
  5. 認証情報を設定

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

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

Addressables統合

ビルドサイズへの影響

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

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

Addressablesと統合することで、この問題を解決できます。 大規模プロジェクトでは、Addressablesと統合することで必要な言語のみをダウンロードできます。Addressables自体の仕組みは Addressables入門 で解説しています。

設定方法

  1. Addressablesパッケージをインストール
  2. Localization Settingsを開く
  3. Asset DatabaseからAddressablesに変更
  4. 各Localeを個別のAddressableグループに配置

メリット

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

まとめ

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

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

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

さらに学ぶために