
キャラクター名
シナモロールをずっとシナモンロールだと思っていた典型的なオジサンの皆さんこんにちは。ポチャッコもポッチャコだと思ってました。キャラクター名って興味がないと覚えられませんよね。ポケモンとかピカチュウ以外知らないし。
ローカライズ
Unity Localizationを使った多言語対応について前回の記事で紹介しました。
www.karvan1230.com
前回はLocalization Tablesを使って静的なテキストのローカライズを行いましたが、ゲーム内で使用するテキストには当然ながら条件によって文言が異なるケースも多々存在するので、そういったテキスト(動的テキスト)についても自動的にローカライズが出来ればスクリプト等で編集する手間が省けて便利になります。
Unity Localizationを使ったローカライズでそのようなケースではSmart Stringsが使えます。
Smart Strings
Smart Stringsとは「規則に基づいた変換を定義する」機能で、例えば「変数:countの値が1,2,3だったら日本語ではそれぞれ一、二、三という文字列に変換する」という定義をLocalization Tablesに行うことができます。
先ほどのケースの場合だと、Localization TablesのValueに相当するセルに
- 英語の場合:{count:choose(1|2|3):1|2|3}
- 日本語の場合:{count:choose(1|2|3):一|二|三}
の定義を記載しておくと、英語ではcountの値に応じて「1」,「2」,「3」と表示され、日本語だと「一」,「二」,「三」と表示されることになります。
上記の記載は「Choose Formatter」というフォーマット形式で{}内の各項目はそれぞれ以下のような意味を持ちます。(Unity公式マニュアルより)

事前準備と基本的な使い方
Smart Stringsを使う場合は事前にLocalization Tablesの対象のセルにSmartのチェックをする必要があります。
各セルの右下の三点リーダの箇所をクリック >Smart String からSmartにチェックを設定します。

Smartにチェックをしたら先ほどのChoose Formatterに準じた形式の文章をセル内に記載していきます。
今回は例としてBoolean形式の「gamepad」という変数を参照したChoose Formatterを定義します。

上の定義が正しく動けば日本語では以下のように表示されるはずです。
- gamepadがTrueの場合:…タイミングでボタンを押します…
- gamepadがFalseの場合:…タイミングでキーを押します…
次にBoolean形式の「gamepad」という変数の定義をLocalize String Eventコンポーネントに追加します。
上記のテキストを表示するTextMeshProオブジェクトのInspectorのLocal Variables欄から「+」をクリックしてBoolean形式の「gamepad」を追加します。

この状態でゲームを実行すると

gamepadがTrueの場合

gamepadがFalseの場合
gamepadの値応じて表示する文言が変わるようになります。
定義した変数の値によって文言を変えられるようにはなりましたが、上記のままでは所詮Inpector上の設定による変更のみでゲーム実行中の状態変化に対応して文言を切り替えられるわけでありません。
ゲーム実行中にスクリプト内で変数を更新して文言を切り替えたい場合はChoose Formatterに設定する変数にGlobal Variable(グローバル変数)を指定します。
Persistent Variables Source
Global Variable(グローバル変数)は文字通りゲーム内で有効なグローバル変数でSmart Stringsと連携することが出来ます。
今回の場合、「gamepad」をGlobal Variable(グローバル変数)に定義しておくことで、スクリプト側で「gamepad」の値を変更するとChoose Formatterの定義通りに文言が変更されます。
このGlobal VariableはPersistent Variables sourceを使って定義します。
まずメニューのAssetsから[Create -> Localization -> Variables Group]を選んで変数グループアセットを作成します。

プロジェクト内の任意のフォルダにVariable Groupのアセットファイルが作成されるので、そのアセットをダブルクリックで Inspector ビューを開き、[+]ボタンからBoolean形式の「gamepad」を設定します。

次にこのVariable Groupのアセットを Persistent Variables source のグローバル変数に登録します。
メニューから[Edit > Project Settings]を開き、[Localization]タブから[String Database > Smart Format > Sources > Global Variables]のリストを[+]ボタンで追加します。

追加データにグループ名とVariable Groupアセットを登録します。
今回は以下のグループ名としました。
グループ名:global
これで「global」というグループ内に「gamepad」という変数がスクリプトでも、LocaizationのSmart Stringでも参照可能となったので、Localization Tablesの定義を「gamepad」から「global.gamepad」に変更します。

また、Localize String EventコンポーネントのLocal Variables欄は削除しておきます。

スクリプトで変更する
スクリプト側からGlobal Variableの変更は以下のように行います。
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.SmartFormat.Extensions;
using UnityEngine.Localization.SmartFormat.PersistentVariables;
public static class LocalizationUtil {
public static void SetLocalizedStringFromGlobal(string param1, string param2, bool argValue)
{
var source = LocalizationSettings.StringDatabase.SmartFormatter.GetSourceExtension<PersistentVariablesSource>();
var targetValue = source[param1][param2] as BoolVariable;
targetValue.Value = argValue;
}
}
動作確認
今回はゲーム実行中にゲームパッドへの接続有無を監視して、それに応じてGlobal Variableの値をスクリプト側から変更するようにしました。

表示される文言が変更されていることが分かると思います。