しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity の Localization でアプリ名を多言語化対応する

※ これは 2022/11/11 時点の Unity 2022.1.22f1 Localization v1.4.2 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

前回、Unity の Localization でアプリ名の多言語化をやってみたが、ビルド時にエラーが出たので解消を試みる

謎エラー

Localization パッケージ内の PBXProjectExtensions.cs の 95 行目で AmbiguousMatchException が発生していた

AmbiguousMatchException の内容を見るにリフレクションで複数の対象が見つかって対象が特定できない系のエラーっぽい

該当する Localization パッケージ内の Library/PackageCache/com.unity.localization@1.4.2/Editor/Platform/iOS/PBXProjectExtensions.cs の 95 行目 を見てみると

s_PBXBuildFileDataCreateFromFile = s_PBXBuildFileDat.GetMethod("CreateFromFile", BindingFlags.Static | BindingFlags.Public);

PBXBuildFileData.CreateFromFile() のメソッドをリフレクションで取得している

・・・というわけで UnityEditor.iOS.Xcode.PBX.PBXBuildFileData.CreateFromFile() の定義を確認してみると下記のような感じだった

#region アセンブリ UnityEditor.iOS.Extensions.Xcode, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// UnityEditor.iOS.Extensions.Xcode.dll
#endregion

using System.Collections.Generic;

namespace UnityEditor.iOS.Xcode.PBX
{
    internal class PBXBuildFileData : PBXObjectData
    {
        public string fileRef;
        public string compileFlags;
        public List<string> assetTags;
        public bool weak;
        public bool codeSignOnCopy;
        public bool removeHeadersOnCopy;
        public bool publicHeader;

        public PBXBuildFileData();

        public static PBXBuildFileData CreateFromFile(string prefix, string fileRefGUID, bool weak, string compileFlags);
        public static PBXBuildFileData CreateFromFile(string fileRefGUID, bool weak, string compileFlags);
        public void SetCompileFlags(string flags);
        public override void UpdateProps();
        public override void UpdateVars();
    }
}

確かに CreateFromFile()シグニチャは2つあり、このままだとどっちのメソッドか特定できない

これは Unity の Localzation パッケージの不具合!

しかたがないので無理やり PBXProjectExtensions.cs の 95 行目を下記のように使っているシグニチャに特定できるよう書き換える

s_PBXBuildFileDataCreateFromFile = s_PBXBuildFileDat.GetMethod("CreateFromFile", new Type[] { typeof(string), typeof(bool), typeof(string)});

これだけだと UnityEditor に戻ったときにまた元のコードに戻ってしまうので、mac 上で書き変えた .cs ファイルの「情報を見る」ダイアログを開き、ロックをオンにする

戻らないようにロック

これで iOSXcode プロジェクトのエクスポートを実行してみると・・・

言語化できた

エラーなくエクスポートが完了し、Xcode のプロジェクト内に InfoPlist.strings が生成された!

ちゃんとアプリ名が多言語化された模様

不具合さえなければ簡単にアプリ名が多言語化されるようになっている

・・・いくら Experimental とはいえこういう不具合は早く直してほしい Unity さん!