概要
シェーダーに記述したフォグの数値を、複数のオブジェクトで変更しようと、スクリプトにシーン内のマテリアルの数だけ繰り返すスクリプトを書いたのですが
どうやらそれよりもっとイージーな方法があったようです。
Shader.SetGlobalFloat("パラメータ名", 値 );
使い方
(毎フレームやりたければ)Update関数の中で、関数を呼び出すだけです。
シェーダー側にかんしてここにある例を使うと
Shader "Example/Normal Extrusion" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
//_Amount ("Extrusion Amount", Range(-1,1)) = 0.5
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input {
float2 uv_MainTex;
};
float _Amount;
void vert (inout appdata_full v) {
v.vertex.xyz += v.normal * _Amount;
}
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
この場合プロパティは_Amountです。
しかし、Propertiesの中で宣言しちゃうと、UIに表示されるようになり、常にそっちで上書きされるっぽいのでコメントアウトしています。
スクリプト側からは
Shader.SetGlobalFloat("_Amount
", 0.3 );
とかにしてあげると、全てのシェーダーにある_Amountというプロパティが一斉に0.3に変更されます。
なので、シェーダーのプロパティ名が違う目的のものなのに、複数のシェーダーで被っていると意図せず変更されてしまうことになります。お気を付けください。