本日はshader勉強枠です。
UnityのShaderではマテリアルに表示されるパブリックな変数をスクリプトで変更できます。
例えば次のような[Universal Render Pipeline/Lit]シェーダーのマテリアルをアタッチしたPlaneの例を見てみます。
使用しているShaderごとに変数は異なります。これを確認するためにはマテリアルのインスペクターウィンドウ上部のメニューから[SelectShader]でShaderの元ファイルを選択します。
Shaderの元ファイルの[Propeties]以下に表示されている変数がスクリプトでアクセス可能な変数になります。
次のスクリプトをPlaneにアタッチします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MaterialChanger : MonoBehaviour { private Material _mat; [SerializeField] private Color _Maincol; [SerializeField] private float _smoothness; // Start is called before the first frame update void Start() { _mat = GetComponent<Renderer>().material; _mat.SetColor("_BaseColor",_Maincol); _mat.SetFloat("_Smoothness",_smoothness); } }
実行することでスクリプトでマテリアルの値を変化できました。
これらのUnityのマテリアル側からアクセス可能な変数は[Properties]ブロックで定義されています。
Properties { ... [MainColor] _BaseColor("Color", Color) = (1,1,1,1) ... _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5 ... }
同様にShaderGraphの場合はマテリアル側で扱える変数は[Backboard]に記述されます。
ShaderGraphも同様にインスペクタから[Properties]によって変数が定義されています。
しかし[Vector1_90f04088abb342df9b80cf49ccfab668]のように非常にわかりにくい変数名になっています。
これはShaderGraphのBackboardで変数を選択した状態でGraphInspectorに表示される[Refarence]で定義されます。
[Refarence]を書き換えることでコード同様可読性があるスクリプトでアクセス可能な変数が作成できます。
後は前述のコードのShader同様の方法でスクリプトでアクセス可能になります。