この記事でのバージョン
Unity 2022.2.2f1
Localization 1.3.2
はじめに
今回はUnityでiOS向けにビルドした際にLocalization関係の以下のようなエラーが出て、
InfoPlist.stringsが生成されない(ローカライズされていない)時の対処法です!
AmbiguousMatchException: Ambiguous match found.
System.RuntimeType.GetMethodImplCommon (System.String name, System.Int32 genericParameterCount, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, System.Reflection.CallingConventions callConv, System.Type types, System.Reflection.ParameterModifier modifiers) (at <1b72fc97b7c245a483150421232eb6a9>:0)
System.RuntimeType.GetMethodImpl (System.String name, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, System.Reflection.CallingConventions callConv, System.Type types, System.Reflection.ParameterModifier modifiers) (at <1b72fc97b7c245a483150421232eb6a9>:0)
System.Type.GetMethod (System.String name, System.Reflection.BindingFlags bindingAttr) (at <1b72fc97b7c245a483150421232eb6a9>:0)
UnityEditor.Localization.Platform.iOS.PBXProjectExtensions..cctor () (at ./Library/PackageCache/com.unity.localization@1.3.2/Editor/Platform/iOS/PBXProjectExtensions.cs:95)
Rethrow as TypeInitializationException: The type initializer for 'UnityEditor.Localization.Platform.iOS.PBXProjectExtensions' threw an exception.
UnityEditor.Localization.Platform.iOS.Player.AddLocalizationToXcodeProject (System.String projectDirectory, UnityEngine.Localization.Platform.iOS.AppInfo appInfo) (at ./Library/PackageCache/com.unity.localization@1.3.2/Editor/Platform/iOS/Player.cs:58)
UnityEditor.Localization.Platform.iOS.Player.AddLocalizationToXcodeProject (System.String projectDirectory) (at ./Library/PackageCache/com.unity.localization@1.3.2/Editor/Platform/iOS/Player.cs:42)
UnityEditor.Localization.Platform.iOS.LocalizationBuildPlayerIOS.OnPostprocessBuild (UnityEditor.Build.Reporting.BuildReport report) (at ./Library/PackageCache/com.unity.localization@1.3.2/Editor/Platform/iOS/BuildPlayerIOS.cs:57)
UnityEditor.Build.BuildPipelineInterfaces+<>c__DisplayClass18_0.b__1 (UnityEditor.Build.IPostprocessBuildWithReport bpp) (at /Users/bokken/build/output/unity/unity/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:529)
UnityEditor.Build.BuildPipelineInterfaces.InvokeCallbackInterfacesPair[T1,T2] (System.Collections.Generic.List`1[T] oneInterfaces, System.Action`1[T] invocationOne, System.Collections.Generic.List`1[T] twoInterfaces, System.Action`1[T] invocationTwo, System.Boolean exitOnFailure) (at /Users/bokken/build/output/unity/unity/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:465)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&) (at /Users/bokken/build/output/unity/unity/Modules/IMGUI/GUIUtility.cs:189)
対処法
そもそもこのエラーはLocalizationのバグなので
修正済みのバージョン(1.4.3または1.5.x以上)にすれば直るはずですが、
この記事執筆時点ではまだリリースはされてないようです。
Fix In Review for 1.4.3, 1.5.x
また、Unityのバージョンによっては発生しないようなので、
Unityのバージョンを下げて解決する事も可能です。
Reproducible with: 1.0.5 (2022.1.16f1), 1.4.2 (2022.1.16f1, 2022.1.23f1 2022.2.0f1, 2023.1.0a21)
Not reproducible with: 1.0.5 (2020.3.42f1), 1.4.2 (2020.3.42f1, 2021.3.14f1, 2022.1.15f1)
一応修正されてないUnityやLocalizationのバージョンでも
以下の記事のようにすれば対応する事も可能です。
具体的にはUnity上からは見えない(Finderから探す感じ)
Library/PackageCache/com.unity.localization@1.3.2/Editor/Platform/iOS/PBXProjectExtensions.cs
というファイルの95行目を以下のように書き換え、
//↓元あったやつはコメントアウト //s_PBXBuildFileDataCreateFromFile = s_PBXBuildFileDat.GetMethod("CreateFromFile", BindingFlags.Static | BindingFlags.Public); //↓新しく追加 s_PBXBuildFileDataCreateFromFile = s_PBXBuildFileDat.GetMethod("CreateFromFile", new Type[] { typeof(string), typeof(bool), typeof(string)});
そのファイルの情報を見るから
ロックし、変更内容が戻らないようにするだけです。