はじめに
いつの間にかiOSシミュレータ用のビルドができなくなって困り、いろいろ調べたメモ。
経緯と症状
- いつの間にかXcodeが起動できなくなった(勝手にXcodeがアップデートされた?)
- OSをアップデート、Xcode11が使えるように
- シミュレータ用ビルドが以下のエラーで通らなくなった
Unity-iPhone > Classes > Unity > UnityMetalSupport.h > CAMetalLayer
Duplicate interface definition for class 'CAMetalLayer'
Property has a previous declaration
Property has a previous declaration
Property has a previous declaration
..
Player Settings
のGraphics APIs
の設定をガチャガチャいじってみても解決せず。
再現環境
- Unity
- 2018.2.21f1
- 2017.3.1f1
- Xcode11
- Target SDK:Sumulator SDK
原因
Xcode - New Features
・CAMetalLayer is now available in Simulator. (45101325)
新しいXcodeではシミュレータでも CAMetalLayer
というのが使えるようになったらしく、これまでUnityがシミュレータ用ビルド向けにゴニョゴニョしていた部分とコンフリクトを起こしているみたいです。
この問題は以下のIssue Trackerにも登録されていました。
Unityのリリースノートをたどったところ、以下のバージョンで対応済みのようです。
- 2019.2.3f1(2019/8/28リリース)
- 2018.4.9f1(2019/9/13リリース)
iOS: Fixed simulator build on xcode11 beta (metal headers were added) - now we use headers if available instead of forcibly declaring symbols (1163876, 1170516)
2017.x系については最近のリリースノートを探しても見当たらなかったので未対応だと思われます(LTSのサポート切れ?)。
対処方法
使用するUnityのバージョンを上げる
先に述べたとおり2019.2.3f1,2018.4.9f1以降では対応済みなので、素直にUnityのバージョンを上げましょう。
ただし、2018.4.9-10は不具合があるとかでアップデートするかどうかは悩みどころ。
2019/10/25(金)追記
不具合が直ったみたいなので2018.4.11を使いましょう。
引数付きのUnityEventsが使えなくなるUnity2018.4.9~.4.10の不具合は、Unity2018.4.11で修正されているのを確認しました。#Unity宴 https://t.co/8x7ir8a2c2
— 時村良平 (@rodostw) October 14, 2019
追記ここまで
Unity2018.4.9はUnityに不具合があるため使用しないでください。
— 時村良平 (@rodostw) September 21, 2019
引数つきのUnityEventの挙動が不安定になるため、Unity公式のEventTriggerやSliderのほか、宴のイベント設定などが正常に動作しません。 #Unity宴https://t.co/B9HaQ99Sa1 pic.twitter.com/EoQgn1ilxv
引数つきのUnityEventsが使えなくなるUnity2018.4.9の不具合ですが、Unity2018.4.10でも解消されていませんでした。
— 時村良平 (@rodostw) October 2, 2019
Unity2018.4.9、Unity2018.4.10は使用しないようにしてください。 #Unity宴 https://t.co/8x7ir8a2c2
古いXcodeを使う
とりあえずXcode10.3なら問題なくビルドできたので、Unityをアップデートできない人は古いXcodeを使うしかないでしょう。iOS13の対応や今後のこともあるのであまりおすすめはしません。
Xcodeが複数インストールしてあるとBuild Settings
からビルドに使用するXcodeのバージョンを選択できます。
ちなみに
Xcode11ではApplication Loaderが同梱されなくなったそうです。
ビルドをApplication LoaderでApp Store ConnectにアップロードするJenkinsおじさんとかがいたら死ぬので対応しましょう。