はじめに
先日、uLipSync v3.0.2 をリリースし、asmdef の Version Defines を利用した VRM 0.X / 1.0 のパッケージのインポート状況に応じた VRM 向けコンポーネントのエラー抑制を行いました。
ただこちら、.unitypackage 経由でインポートした際にうまく動かない、という報告をいただき調査してみました。
原因
Version Defines はパッケージのインポート状況に応じてシンボルを定義できる仕組みです。パッケージはバージョン指定も可能で、またパッケージだけではなく Unity のバージョン指定も出来ます。
ただ、.unitypackage 経由でインストールした際、Version Defines で指定する Resource がインポートされた状態として扱われず、残念ながら Version Defines 経由のシンボル定義が行われません。たしかに、com.vrmc.vrm
という名前は package.json に記述されている名前であり、単純なファイル展開を行う .unitypackage 経由インポートでは検出しようがなさそうです。パッケージ名ではなく、Assembly Definition References(こちらは内部的には GUID)と組み合わせたシンボル定義の仕組みが出来てくれたら救いがあるかもしれません。また、別ライブラリ側が何かしらのシンボルを用意してくれていれば、Define Constraints でそもそもコンパイルされないようにする、なども有効かもしれません。
対策
現状は、インストールしてもらったユーザーサイドで Project Settings > Player > Script Compilation > Scripting Define Symbols から必要なシンボルをマニュアルで定義してもらう必要がありそうです。
おわりに
依存ライブラリがインポートされていないときでも良い感じに動くように対応しようとしていますが、今回のように UPM 外の問題の対応は難しいので、コア機能を絞り、特殊なサンプルは別ライブラリに分離するといった検討も有効かもしれません。