【Unity】AssetBundleでシェーダが動かない時の対処法
こんばんは。今日は「Unity で AssetBundle にすると一部のシェーダが壊れる」問題とその解決法について記事を書いてみたいと思います。
前提、今回の記事は「こうすれば動いた」という私の「体験談」に近いもので、こうすれば必ず動くということを保証するものではありません。悪しからず。
TL;DR
結論、 Project Settings > Graphics > always included shaders の設定を見直そう ということになります。
Why?????
Unityはビルド時に、主に Build Settings > Scenes in Build や Project Settings > Player > Preloaded Assets に含まれるシーンやアセット、及びそれらが依存しているアセットをビルドに含め、残りはビルドに含めないようにしています。
ただし例外も多く、たとえば C# のコードや Resources というディレクトリ以下のファイルは問答無用でビルドに含められます。
さて、シェーダーはどうでしょう。シェーダーは明示的に指定するか、ビルドに含まれるファイルが依存していない限り、ビルドには含められない種類のファイルです。
このアルゴリズムは通常のビルドでも AssetBundle でもかなり似通っており、通常のビルドで動くなら、シーンを丸ごと AssetBundle にしても(ほとんどが AssetBundle に含まれるため)動くようになっています。
ですからシェーダーも含めて丸ごと AssetBundle に含めれば、通常のビルドはコンパクトにしても動くはずだ。私は最初、そう思っていました。
AssetBundle とシェーダの問題は根深いらしい
……どうにも AssetBundle でシェーダを使う問題は根深いようで、通常のビルドで動いても、シェーダに限っては AssetBundle で動かない(?)というような状態が起こりうるようです。
……で、色々調べたり試した結論として、 AssetBundle ではなく通常のビルドに シェーダが含まれていれば動くようだ、となりました。
ですから Resources ディレクトリに元々配置されているシェーダは動くのですが、そうではないシェーダは動かない、などの違いが生まれます。実際、私の場合は動かなかったシェーダを Resources フォルダに移動することで一旦は動きました。
ただもっと 筋の良い 解決策はないかと検討していた所、 always included shaders というそのものずばりな設定を発見。そちらに問題のシェーダを設定し、事なきを得たという話です。