💭
Unity公式のローカライズ機能をVisualScirptingで使う
概要
PackageManagerから使える機能で、Localizationというものがあり、多言語対応が公式で可能になっています。
Localizationについては、公式の動画なり、技術ブログなりを参考にして下さい。
私はVisualScirpting
で使いたかったので、最終的にVisualScirpting
で使えるようなスクリプトを書く事で目的を達成しました。
最終的にできたもの
ローカライズ用のテーブルにkeyを与えて検索する事で任意のメッセージを出しています。
スクリプト
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Localization.Settings;
using System;
public class LocalizerKeyChange : Unit
{
[DoNotSerialize]
public ControlInput inputTrigger;
[DoNotSerialize]
public ControlOutput outputTrigger;
// Inputにしたい変数
[DoNotSerialize]
public ValueInput _keyName;
[DoNotSerialize]
public ValueInput _tableName;
// Outputにしたい変数
[DoNotSerialize]
public ValueOutput _output;
protected override void Definition()
{
inputTrigger = ControlInput(nameof(inputTrigger), (flow) => { return outputTrigger; });
outputTrigger = ControlOutput(nameof(outputTrigger));
_keyName = ValueInput<string>("NewKeyName");
_tableName = ValueInput<string>("TableName");
// OutputにGetkeyValueのreturnを入れる
_output = ValueOutput(nameof(_output), GetkeyValue);
// 入力と出力のリレーションを設定する
Requirement(_keyName, inputTrigger); // inputTriggerがトリガーされたときに_keyNameが取得される
Requirement(_tableName, inputTrigger); // inputTriggerがトリガーされたときに_tableNameが取得される
Succession(inputTrigger, outputTrigger); // OutputがトリガーされたときにInputがトリガーされる
}
private String GetkeyValue(Flow flow)
{
var table_name = flow.GetValue<string>(_tableName);
// ローカライズテーブルを指定して取得
var table = LocalizationSettings.StringDatabase.GetTable(table_name);
// Keyを指定して、Entryを取得
var value = table.GetEntry(flow.GetValue<string>(_keyName)).Value;
return value;
}
}
スクリプトを使用したVisualScirpting
自分の作成したスクリプトのノードが見つからない場合は
編集>プロジェクト設定>VisualScirpting>Regenerate Nodesを押して更新すると見つかります。
まとめ
Localizationは多言語対応のために提供されている機能ですが
ローカライズ用のテーブルを単純にメッセージ用のテーブルとして捉えて
Keyを指定して、その場にあったメッセージを引っ張ってこれるような気がしています。
それに加えて、ローカライズもできるので機能として幅広いですよね。
スクリプトに書かなくても済むし
ただ、動作が安定するかはわからないのでとりあえず使ってみようと思います。
あとは、自作のVisualScirpting用スクリプトについては
もっと細かく資料として残しておきたい
Discussion