太郎Work

Unityとかで困ったこと等を残しておきます

UnityiOSのdevelopment build の場合スプラッシュスクリーンで止まる

UnityのiOS書き出しの際development buildにチェックを入れて出力すると
スプラッシュスクリーン表示中に停止してしまう問題が有り、解決に時間がかかったのでメモ

XCodeのLogを確認すると別スレッドからアクセス出来ない的な文章が出ているのみで
空のシーンを起動しても変わらず。

結局MonoBehaviourを継承していない普通のクラスのstaticフィールドでUnityのメソッドを呼んでいることが原因だった。

public static readonly Dictionary<eTest, string> dic = new Dictionary<eTest,string>() {
  {eTest.TEST1, Localization.Localize("test1")},
  {eTest.TEST2, Localization.Localize("test2")},
};

初期化時にローカライズのテキストをenumで取得できるようにしたかったがこの記述があるだけで呼んでいなくても停止してしまった。

挙動をまとめました。

non develop develop
Editor 動作 動作
iOS Localizationが初期化されずに動作 スプラッシュスクリーンで停止

Editor上だと何も問題なく動作してしまうため発見が遅れました。

なので必要になった時取得するように変更しました。

private static readonly Dictionary<eTest, string> _dic;
public static Dictionary<eTest,string> dic {
  if(_dic == null) {
    _dic = new Dictionary<eTest,string>() {
      {eTest.TEST1, Localization.Localize("test1")},
      {eTest.TEST2, Localization.Localize("test2")},
    };
  }
  return _dic;
}

Logを出してみるとUnityのAwake等よりも先にUnityでない通常クラスのstaticフィールドのコンストラクタが呼ばれるようです。

Editor上だと再生時にエラーは出ないが一度失敗してからUnityのAwake等のタイミングでまた呼ばれていることが確認できました。

なので、iOSのdevelopmentだと何か挙動が挟まるせいでUnity起動の前にクラスの初期化が呼ばれてるようです。

皆様もiOSのdevelopmentビルドのみ起動出来なくなった場合はこういったコードがどこかに埋まってないか確認してみてください。