シェーダーがビルドから消えた日
Unity エディターでは、すべて完璧に見えました。ところが、できあがったビルドでは、ピンク色の面と、消えたエフェクト。Unity のいちばんやっかいな落とし穴のひとつと、その親戚たちへようこそ。
シェーダーのストリッピング。ビルドのとき、Unity は、必要なさそうなものをすべて捨てます。シェーダーも例外ではありません。問題は、Shader.Find() で実行時にシェーダーを読み込む場合です(私たちは、水、大気、ホログラムなどのために、20個以上の独自シェーダーでそうしています)。Unity は、どのシーンにもそれへの参照を見つけられません。その結果、シェーダーはエディターにはあるのに、ビルドには消えてしまいます。解決策は地味ですが、欠かせません。これらのシェーダーは、すべてグラフィックス設定のAlways Included Shadersのリストに入れる必要があります。それ以来、私たちのルールは、新しいシェーダー? すぐ追加、です。
-1 だったレイヤー。似た種類の話です。物理レイヤーを、コードの中で名前で探していました。エディターでは動きます。でも、ビルドサーバーのバッチビルドでは、そのレイヤーが存在せず、検索は -1 を返し、そのレイヤーに頼るすべてが、静かにおかしな動きをします。それ以来、レイヤーは名前ではなく、決まったインデックスで指定しています。
教訓:Unity エディターと、できあがったビルドは、別の世界です。エディターは寛大で、すべてのアセット、名前、シェーダーが手元にあります。ビルドは容赦がありません。だから私たちは、クライアントのどんな変更でも、エディターの再生ボタンだけでなく、ローカルで本物のビルドをテストします。時間はかかります。それでも、恥ずかしいリリースをたくさん防いでくれました。
コメント