本日はUnityの小ネタ枠です。
UnityでプロジェクトをビルドするとShader.Findが失敗する問題の対処についてです。
事象
以下のようにShader.Findを使ってAssetsフォルダ内のシェーダを参照するプロジェクトを作成しました。
// Shader.Find()でシェーダーを取得 ScanLineObject.GetComponent<Renderer>().material.shader = Shader.Find("Unlit/ScanLineUnlitShader"); FlickerObject.GetComponent<Renderer>().material.shader = Shader.Find("Unlit/FlickerUnlitShader");

本プロジェクトはエディター上の再生では正常にシェーダを参照して動作します。

しかし本プロジェクトをビルドして実行ファイルで動作を確認すると、以下の通りシェーダを参照できず正常に動作しません。


原因
Unityはビルド時にシーンを検査して、シーン内で利用されていないシェーダ―バリアントを自動的に除去します。
Shader.Findによる参照はこの検査で考慮されないため、ビルド時に指定のシェーダが除去されていることが原因です。
docs.unity3d.com
対処
対象のシェーダをAlways Included Shadersに登録することで必ずビルドに取り込むことができます。
メニューから[Edit -> Project Settings..]を開き、[Graphics]タブを開きます。

ページ下部の[Built-in Shader Settings -> Always Included Shaders]を開きます。
本項目のSizeを増やして対象のシェーダを追加します。これで登録完了です。

この状態でプロジェクトをビルドして実行ファイルで動作を確認すると、以下の通り正常にシェーダを参照して動作します。
