Unity as a Library のハマりポイント集

## 前段
Unity as a Library （以下UaaL）は、UnityでビルドしたプロジェクトとObjectiveC/Swift/SwiftUIのプロジェクトを~~悪魔~~合体できるという~~変態的な~~素晴らしい仕組みだ。

基本的な仕組みは他のブログを参考にしていただけると良い。
https://jpdebug.com/p/2469679
https://www.tattichan.work/entry/2021/06/25/Unity_as_a_Libraryと_SwiftUI_で作るARアプリ_%28前編%29

ちなみに今回、当方で実践したのはUnity+SwiftUIであり、比較的参考文献が少ないが以下のブログが大変役に立った。
https://davidpeicho.github.io/blog/unity-integration-swiftui/
↑のリポジトリ
https://github.com/DavidPeicho/unity-swiftui-example/tree/old/unity2020

このブログでは当方でUaaLでハマったことをツラツラと書いていく。

## Q. Unity側を再ビルドしたら、Swift側でビルドできなくなった
Unityで再ビルド（Replace）すると
![スクリーンショット 2022-05-20 23.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/b63945b3-e374-50e9-3585-1e230b66d02e.png)
UaaLで全体ビルドがなぜか通らなくなる

## A. Build System を「New Build System」に変更しなおす
UnityでiOSビルドを作ると、「Xcode Legacy Build system」で作ってしまう（Unity2021.1.6f1で確認）。これだとそもそもiOSビルドができない。

:::note warn
2022.5.21 追記
@mao_  さんのコメントでUnityバージョンアップによって、こちらが修正されているとの指摘をいただきました。
実際に最新版の 2021.3.3f1 で試したところ「New Build System」でビルドできました。
:::


File → Project Settings で Build System を「New Build System」に変更すればビルドしてくれるのだが、一回リビルドしてしまうと再び「Legacy Build System」になってしまうので注意。

https://forum.unity.com/threads/xcode-legacy-build-system-is-deprecated.999532/

なお、通常の単体ビルドをすればエラーメッセージですぐに気づくのだが、UaaLでビルドしているとそれに気づかない。

## Q. Unity側で起動時に「[libil2cpp] ERROR: Could not open」と出て、落ちる
こんな感じのログがコンソールに出てくる
```
[libil2cpp] ERROR: Could not open
/var/containers/Bundle/Application/
****/ZZZZ.app/Frameworks/UnityFramework.framework/Data/Managed/Metadata/global-metadata.dat
   IL2CPP initialization failed
```


## A. Unity側のプロジェクトで「Data」フォルダのTarget Membershipを「UnityFramework」にチェックを入れる

Unity側をビルドすると、「Data」フォルダが↓このように「Target Project」が「Unity-iPhone」になっているが（これはUnityでアプリを作るので当たり前）
![スクリーンショット 2022-05-20 22.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/35eb68a9-0d4f-feed-e9c7-c611adf17c1d.png)
　　↓
Swift側でビルドするのであれば、以下のように「UnityFramework」にしておかないとリンクされない（のでクラッシュする）
![スクリーンショット 2022-05-20 22.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/7a10fd67-a893-02f0-688e-7e58c9014f4b.png)


## Q. なぜか以下のエラーが出てリンクができなくなる

```
/aaaa/bbb/NativeCallProxy-Bridging-Header.h:13:10: error: 'UnityFramework/NativeCallProxy.h' file not found
#include <UnityFramework/NativeCallProxy.h>
         ^
1 error generated.
<unknown>:0: error: failed to emit precompiled header
'/Users/myUser/Library/Developer/Xcode/DerivedData/XXX-
ahqzulzcsrizsffdoonndkyblpuk/Build/Intermediates.noindex/PrecompiledHeaders/
NativeCallProxy-Bridging-Header-swift_18V7S09DN9EIS-clang_7WH5WTMDIV2M.pch' 
for bridging header 'NativeCallProxy-Bridging-Header.h'
```

## A. Simulator用にビルドしようとしている

Unityだけで開発するときはほぼ実機でしかビルドしないだろうが、SwiftUIを使っているとついシミュレーターでもビルドしてしまうことがある。その際UaaLだとUnity側が実機ビルドにしか対応していないためビルドできない。

なお、Unityでも以下のブログのようにシミュレーター用にビルドすれば、UaaLもシミュレーター用にビルドできるかと思う。（が、今度は実機用にビルドできなくなる）
https://develop.hateblo.jp/entry/unity-ios-simulator

## Q. なぜかBridging-Headerが見つからないと出てくるようになる
~~~
<unknown>:0: error: error opening input file 'XXX/YYY/NativeCallProxy-Bridging-Header.h'
 (No such file or directory)
~~~

## A. Bridgingファイルはプロジェクト管理されているので、移動したり名前変更すると見つからなくなる

例えば、「Bridging-Header.h」 の場所を「ObjC/Bridging-Header.h」 とかに再配置してみる。すると上記エラーが出てビルドができなくなる。

これは「Build Settings」の「Objective-C Bridging Header」という項目にファイルパスを書き込んであるからである。
![スクリーンショット 2022-05-20 23.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/b7e5d4df-6a57-1025-2791-65a220af9cfc.png)
つまりファイルを再配置や命名変更した場合は、忘れずにこの項目も変更しなくてはいけない。

## 参考ブログ

https://qiita.com/ysn/items/fa85612cb5adf9a4c05d