エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

スクリプトからLocalizationのStringTableCollectionのCSVインポートをさせる

UnityのLocalizationを利用する際、制作中のゲームではStringTableCollectionをCSVからインポートしていました。 ただ用途によってStringTableCollectionを複数に分割している為、CSVも分割した数だけ存在するのでGUIからのインポートがとても苦痛…。

そこで、今回はスクリプトからインポート対象のCSVをまとめてインポートできないか調べたところ、できそうなので備忘録として残します。

ソースコード

static Dictionary<string, string> CsvPaths = new Dictionary<string, string>()
{
    { "FooTable", "***********/FooTable.csv" },
    { "BarTable", "***********/BarTable.csv" },
    { "BazTable", "***********/BazTable.csv" },
};

static void ImportAllExtensions()
{
    ReadOnlyCollection<StringTableCollection> stringTableCollections = LocalizationEditorSettings.GetStringTableCollections();

    foreach (StringTableCollection collection in stringTableCollections)
    {
        foreach (CollectionExtension extension in collection.Extensions)
        {
            if (extension is CsvExtension csvExtension)
            {
                string filePath = CsvPaths[collection.name];
                if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))
                {
                    using (var stream = new StreamReader(filePath))
                    {
                        Csv.ImportInto(stream, collection, csvExtension.Columns);
                    }
                }
            }
        }
    }
}

ImportAllExtensions()を任意の場所から呼ぶことでCsvPathsで定義したパスのcsvファイルをインポートする形となっています。

StringTableCollectionにインポートするためのAPIとしてCsv.ImportInto()が用意されていますので、引数にStreamReader,StringTableCollection, CsvColumnsを渡して呼んであげればGUIでインポートする時と同様にインポートしてくれます。

Class Csv | Localization | 1.0.5

どこからこのメソッドを呼ぶかは任意ですが、私はシーンビュー上にインポートボタンを配置してボタンを押した際に実行するようにしています。

↓シーンビュー上にボタンを置いて任意の処理を実行する方法は、以前以下の記事で取り上げましたので興味があればご覧下さい!

tm-progapp.hatenablog.com