【Unity】【シェーダ】別階層のcgincを変更してもそれをincludeするシェーダがコンパイルされない件(Unity2017)

別階層のcgincを変更してもそれをincludeするシェーダがコンパイルされない(されなかった)話です。
Unity2018では修正されているようなのでこれから直面する方は少ないと思いますが一応。

問題点

Unity2017.4で下記のような問題に直面しました。

いま、Example.shaderExampleCG.cgincをインクルードしているとします。
ここでまずこの二つのファイルを同じ階層に置いてみます。

Assets
┣ Example.shader (ExampleCG.cgincをinclude)
┗ ExampleCG.cginc

この状態でcgincの中身を書き換えると、シェーダファイルが再コンパイルされて変更が反映されます。
つまり正常な挙動です。

次にこの二つのファイルを別の階層に置いてみます。

Assets
┗Example.shader (ExampleCG.cgincをinclude)
  ┗ExampleCG.cginc

この状態でcgincの中身を書き換えると、なんとシェーダファイルが再コンパイルされません。
cgincを更新すると同じ階層のシェーダファイルだけが再コンパイルされるようです。使いづらい・・

解決策1 Unityアップデート

そもそも前節の問題はUnity2017.4.6で確認したのですが、
意図しない挙動だったのか、Unity2018.1.4で確認したところ修正されていました。

具体的にどのタイミングで修正されたのかは調べていませんが、Unity2018.1.4以降にアップデートするのが一番の解決策になりそうです。

解決策2 スクリプトからコンパイル

アップデートできない状況下では、何らかの契機でシェーダを再コンパイルする必要があります。
シェーダのコンパイルはReimportすればできるので、下記のようなコードを書けばOKです。

var shaderPaths = AssetDatabase
    .FindAssets("t:Shader")
    .Select(x => AssetDatabase.GUIDToAssetPath(x));

foreach (var shaderPath in shaderPaths) {
    AssetDatabase.ImportAsset(shaderPath);
}

参考

answers.unity.com