💭

Unity公式のローカライズ機能をVisualScirptingで使う

2022/06/08に公開

概要

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