ノートの端の書き残し

UnityやらC#やら。設計が得意かもしれない。

Unityの実行中にコンパイルが走らないようにする設定、シェーダーは含まなくてよくない?

Unityでは、エディタ再生中にスクリプトを変更した場合の動作を設定できます。 f:id:u_osusi:20220330142551p:plain 多分、大体の人はRecompile After Finished Playingに設定しているだろうと思われます。
実行中にスクリプトいじっても、再生を終了するまでは反映しない設定です。

一応、リコンパイル範囲内で今実行中に参照している全ての変数がシリアライズ可能なら、実行中にコンパイルされても問題無く動き、つまりホットリロードが実現できます。が、よほど小規模なプロジェクトでもない限り、Unityでそれをするのは現実的ではないですよね。(過去のCEDECでの講演で聞いたのですが、HAL研究所カービィ開発環境ではスクリプト変更でホットリロードされるらしく、素晴らしい技術力とそれを発揮できる開発環境だなぁと感心しました。)

という背景があるので自分も当然Recompile After Finished Playingを常に選択しているのですが、1点だけ困ったことがあるんですよね。
というのも、シェーダ自体は実行時にコンパイルされても何も問題ないなぁと……

docs.unity3d.com

シェーダはシリアライズされてない変数が蒸発しても何も問題無いし、シェーダスクリプトを直接いじりながら見た目の変化を確認したいことが多いです。なので、C#はエディタ再生終了した後にコンパイルにしつつ、シェーダのコンパイルは実行中にも走らせる、みたいなことできないかなぁと。
シェーダだけコンパイルが走ることはできているので、スクリプトの変更を検知する部分を読めばできないことはなさそうかな?などと思ってます。
ここですぐにじゃあ調査しよう!とならないのがいつまで経っても二流三流な理由だよなぁ……

なお完璧にホットリロードできたらそれに越したことは無いです。