原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】Unity LocalizationとGlobal Variable を使って動的テキストをローカライズする

キャラクター名

シナモロールをずっとシナモンロールだと思っていた典型的なオジサンの皆さんこんにちは。ポチャッコもポッチャコだと思ってました。キャラクター名って興味がないと覚えられませんよね。ポケモンとかピカチュウ以外知らないし。

 

ローカライズ

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)
  {
    // PersistentVariablesSourceの取得
    var source = LocalizationSettings.StringDatabase.SmartFormatter.GetSourceExtension<PersistentVariablesSource>();

    // 今回の場合、param1に"global" param2に"gamepad"を指定する
    var targetValue = source[param1][param2] as BoolVariable;

    // 更新する値を設定
    targetValue.Value = argValue;
  }
}

 

動作確認

今回はゲーム実行中にゲームパッドへの接続有無を監視して、それに応じてGlobal Variableの値をスクリプト側から変更するようにしました。

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

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。