前段
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)すると
UaaLで全体ビルドがなぜか通らなくなる
A. Build System を「New Build System」に変更しなおす
UnityでiOSビルドを作ると、「Xcode Legacy Build system」で作ってしまう(Unity2021.1.6f1で確認)。これだとそもそもiOSビルドができない。
2022.5.21 追記
@mao_ さんのコメントでUnityバージョンアップによって、こちらが修正されているとの指摘をいただきました。
実際に最新版の 2021.3.3f1 で試したところ「New Build System」でビルドできました。
File → Project Settings で Build System を「New Build System」に変更すればビルドしてくれるのだが、一回リビルドしてしまうと再び「Legacy Build System」になってしまうので注意。
なお、通常の単体ビルドをすればエラーメッセージですぐに気づくのだが、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でアプリを作るので当たり前)
↓
Swift側でビルドするのであれば、以下のように「UnityFramework」にしておかないとリンクされない(のでクラッシュする)
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」という項目にファイルパスを書き込んであるからである。
つまりファイルを再配置や命名変更した場合は、忘れずにこの項目も変更しなくてはいけない。
参考ブログ