TL; DR
- Strip Engine Code の作用により、一部の UnityEngine ネームスペース配下のクラスが含まれなくなった。
- il2cpp を用いたビルドであり、かつ Scene や Prefab を AssetBundle 化している場合に発生する。
link.xml
書くのが手っ取り早いかな?
現象
- ビルドしたアプリで、当たり判定が効かない!という事象が発生。
- クラッシュすることはないのに、兎に角 BoxCollider2D がウンともスンとも言わない。
- 実機ログ見てみたら「Could not produce class with ID 61」と出ている。
原因
- Strip Engine Code という機能により、ビルド対象の Asset や Script から直接参照されていないクラスが除去されたコトが原因でした。
- 詳しくは、安定のテラシュールブログさんを参照のこと。
- BoxCollider2D の他にも、SpriteRenderer とか ParticleRenderer なんかも該当していました。
対応
- テラシュールブログさんの記事でも言及しているように、スクリプトから参照させたり link.xml 書いたりするのがヨサソウです。
- 私は link.xml を書く方法で行きました。
- エラーログに出てくる Class ID を元に Class ID 一覧 からクラス名を割り出し、
UnityEngine.
から始まる完全修飾クラス名を記載する感じです。
- エラーログに出てくる Class ID を元に Class ID 一覧 からクラス名を割り出し、
所感
- この手の「実機でしか起きない」系の問題の原因究明は、「あ、これ○○のサイトで見たことあるなぁ…。」とか「前もハマったことあるぞ!」みたいな経験則に頼りがちなので、どうにかしたいですね…。
- こうやって、地道に Case-Study を書いて知見を溜めていくのが今のところの最適解なのかな?と思っています。