【Unity】ShaderファイルがVisual Studioに追加されないときに確認すべきこと

Unityが生成するVisual Studioのプロジェクトファイルには、シェーダーファイルも含まれます。
これにより、拡張子がshader、cginc、hlslのファイルを、Visual Studioの検索ウィンドウから全文検索することができます。
シェーダーにはIntelliSenseは有効ではないので、ファイル間の参照を確認するにはこの検索機能が必須です。

しかし、ある条件下では、含まれてくれません!

.shaderファイルがVisual Studioプロジェクトに追加されないのは、例えばUnityプロジェクトが以下のような構成のときです。
f:id:kraihd:20200404183324p:plain

  • Assets/Scripts/NewAssembly.asmdef
  • Assets/Scripts/NewBehaviourScript.cs
  • Assets/Shaders/NewUnlitShader.shader

この状態で生成されるプロジェクトは以下のようになってしまいます。 f:id:kraihd:20200404183342p:plain

NewUnlitShader.shader が追加されていませんね。

この現象にはAssembly Definition File (上記でいうNewAssembly.asmdef)が関係しています。
……しかし、なぜC#アセンブリの構成が、C#が全く関係ないはずのシェーダーに影響するのでしょうか。
ここではかなりややこしいことが起こっています。

Unityは基本的に、csファイルを「Assembly-CSharp」というアセンブリコンパイルします。
EditorやPluginsなど特殊な役割のフォルダを除いて、Assets以下全てのcsファイルがコンパイル範囲となります。
Unityプロジェクト内にcsファイルが1つでもあれば――つまり普通は――Assembly-CSharpは生成されます。

ただし、Assembly Definition File を使う場合はその限りではありません。
Assembly Definition Fileとは、置かれたフォルダ以下をコンパイル範囲とし、独自のアセンブリへと区切る機能です。
この機能は便利なため、Assembly-CSharpは生成されるのが普通とは限らなくなりました。

ところで、Unityは、1つのアセンブリコンパイル範囲から、1つのVSプロジェクトを生成します。
そして、アセンブリコンパイル対象となるフォルダの中に、シェーダーファイルがあれば、csだけでなくそれも含めてくれるのです。例えば、アセンブリがAssembly-CSharpただ1つであれば、全てのシェーダーファイルがAssembly-CSharpプロジェクトに含まれます。

何が起こっているか察してきましたね?

全てのcsファイルが、いずれかのAssembly Definitionに属しており、Assembly-CSharpという「Assets以下全てのcsファイル」を担当するアセンブリが生成されない場合。
すなわち、全てのアセンブリが何か特定のフォルダ以下をコンパイル範囲としている場合。
そのうちのどのフォルダにも含まれない所にあるshaderファイルは、どのVSプロジェクトにも含まれないのです!

上記の例でいうと、ShadersフォルダにAssembly Definiton Fileを配置すれば解決できないのでしょうか? ……できないどころか警告すら出ます。csファイルが1つ以上ないとアセンブリは生成されないのです。

バグ報告を行ったところ、これらの挙動は仕様との回答をいただきました。
解決するには、上記のようなフォルダ構成をやめ、csとshaderファイルを近いフォルダに混在させる以外に方法はありません。