少し前から Unity 界隈で有名な VContainer ですが、
Unity Editor だと動くのだけど、IL2CPP だと動作せず困ったので、そのときの対応です。
ワークアラウンド的な対応なので、何かいい方法があったら教えてください。
前提
- Windows10 / M1 Mac
- Android / iOS
- Unity 2020.3.22f1
- VContainer 1.10.0
- IL2CPP ビルドで動作しなかったときは、PackageManager 経由で Github の URL から追加していました。
結論
UnityPackage版を利用する。
PackageManager 経由でインストールした場合、IL2CPPビルドで正常に動作しなかった。
確認したこと
- M1 Mac の iOS でうまくいかない。iOS だから?
- M1 Mac の Android でうまくいかない。M1 だから?
- Windows の Android Mono でうまくいく。IL2CPP だから? (補足あり※1)
- Windows の Android IL2CPP でうまくいかない。ビルド時にコード削除されている?(補足あり※2,3,4)
- Windows の Android IL2CPP でも VContainer のクラス、メソッドは利用できるので、コードは削除されていない。Packages から移動したら動いたり?(補足あり※5)
※1 Mono でビルド
Mono でビルドしたときは PackageManager 経由の VContainer でも正常に動作していました。
※2 [Inject] アトリビュートをつける
IL2CPP環境下では、直接参照のないコンストラクタがビルドから削除されてしまう場合があります。 これを防ぐには、[Inject] アトリビュートをつけて下さい。
とあるので、[Inject] アトリビュートつけて試したのですが、正常に動作させられませんでした。
※3 link.xml を使う
To ensure your constructor is not removed, use a link.xml file or add the [Inject] attribute to one constructor. This also applies to methods.
英語版のドキュメントだと link.xml を使うととあるので、こちらも試してみたのですが正常に動作させられませんでした。link.xml を使い慣れていないので、それが原因かもしれません。
※4 Strip Eingine Code を Off にする
使用されていなコードを削除機能自体 Off にできるみたいだということで、Player Settings の Optimization の Strip Eingine Code を Off にしたのですが、こちらも正常に動作させられませんでした。
※5 自分で Configure を呼んでみる
LifetimeScope を継承しているクラスの Configure を呼んでみても正常に動作させられませんでした。
- えいや呼んだだけで、整合性をとっているわけではないので、それが原因で動作しなかったのかもしれません。
- とはいえ呼べることがわかったので、コードが削除されているわけではないということが確認できました。
- ここでもしかすると Assets フォルダはいかに VContainer のコードがあればうまく動いたり?と想像して UnityPackage を利用する方向にいいきましたとさ。