すぎしーのXRと3DCG

主にXR, Unity, 3DCG系の記事を投稿していきます。

【Unity Localization】 複数のStringTableCollectionを一括PullのTips (拡張ツール提供有り)

概要

今回は Unity Localization に関するTipsです。
ついでに拡張パッケージの作ってみたのでよかったら使ってみてください。

docs.unity3d.com

最近 Unity Localization を触りだしたのですが、リリースされてまだ日も浅いパッケージのせいかまだまだ機能に物足りなさも感じられます。
今回はUnity LocalizationでGoogle Sheetsから 複数のStringTableCollection をまとめて更新するTipsを紹介します。

Unity Localization に関しては デニックさんの以下の記事をご覧ください!

xrdnk.hateblo.jp

環境

  • Unity 2021.3.6f1
  • Unity Localization 1.3.2

補足

StringTableCollection

StringTableCollectionはKey, Value形式で全言語分の翻訳テーブルをまとめているScriptableObjectです。
StringTableはRuntimeで使用可能に対して、StringTableCollectionはEditor限定の機能となります。

Google Sheetsとの対応は Extensions 項目の GoogleSheets を追加及び設定することで実現できます。
SpreadSheetsId, SheetsId (gid) を設定することで、Googleドライブ上のスプレッドシートと対応させます。

GoogleSheetsService

GoogleSheetsService (SheetsServiceProvider) は Googleのサービスとの認証関連を設定するScriptableObjectです。
今回はこちらを使用するため設定をお願いします。

認証の設定については以下のデニックさんの記事をどうぞ!

xrdnk.hateblo.jp

Tips

スクリプトStringTableCollection をPullする方法

簡単に説明すると GoogleSheets.PullIntoStringTableCollection に認証済みのSheetsServiceProvider, SpreadSheetsId, SheetsId を渡すことで可能となります。

結構説明が難しいのでサンプルコードを記載します。

    // 対象のStringTableCollectionを取得
    StringTableCollection collection = AssetDatabase.LoadAssetAtPath<StringTableCollection>("Assets/<path to StringTableCollection>");

    // GoogleSheetsExtensionをStringTableCollectionから取得
    var sheetsExtension = collection.Extensions.OfType<GoogleSheetsExtension>().FirstOrDefault();

    // Google認証設定を持つSheetsServiceProviderを取得
    SheetsServiceProvider serviceProvider = AssetDatabase.LoadAssetAtPath<SheetsServiceProvider>("Assets/<path to SheetsServiceProvider>");

    // Google Sheetsアクセス用インスタンスを生成
    var sheets = new GoogleSheets(serviceProvider);

    // ※必ずSpreadSheetIdをGoogleSheetsインスタンスに指定してください!
    sheets.SpreadSheetId = sheetsExtension.SpreadsheetId;

    // 対象のStringTableCollection内の全言語(全Locale)のPullを実施
    sheets.PullIntoStringTableCollection(
        sheetId: sheetsExtension.SheetId,
        collection: collection,
        columnMapping: sheetsExtension.Columns);

sheets.SpreadSheetId = sheetsExtension.SpreadsheetId; は必ず実施してください。
どうやら1.3.2時点ではInspectorのPullを押したときしか実施されていないようです。

上記コードが StringTableCollection のInspector上のPullボタンと似た処理を実施しています。

複数のStringTableCollectionを一括でPullする方法

スクリプトでPullする方法がわかったので、あとは対象のStringTableCollectionを取得して for ループで実行するのみです。

StringTableCollectionを一括で取得するEditorコード

自分は以下のような指定のフォルダ以下のアセットをまとめて取得するスクリプトを使用しています。

AssetFinding.cs

余談、公式サンプルコードについて

上記のコードのヒントですが、Unity Localization に含まれている DocCodeSamples.Tests/GoogleSheetsSamples.cs に記載されています。

また、その他のサンプルコードも DocCodeSamples.Tests/ 以下にいくつかありますため参考にすると良いと思います!

拡張ツールの紹介

今回、以下のようなUnity Localitionの拡張ツールを用意しました。
いずれ提供される機能だとは思いますが、それまでの代用やコードの参考としてどうぞ。

github.com

StringTableCollectionBundle というScriptableObjectを設定することでまとめてPull, Pushできるようにしています。
Pullには閲覧権限、Pushには編集権限が必要となります。

詳細な使用方法は README.md を参照ください。

サンプルコード

github.com

Assets/Example 以下に実装例があります。

雑感

まさかのローカライズ系の記事になりました。

前回の記事で絶対にXR系の記事を書くと述べたのですが、
どうもいい感じのネタになっておらず一旦別の記事に逃げることにしました。。。

さて、次回は今回の延長で「Unity LocalizationでGCPのサービスアカウントを使ってプライベートなSheetsと連携」みたいな記事を書く予定です。
(ちなみにこの機能はすでに UnityLocalizationExtension に組み込んであったりします。)

それでは~