SuiTechLog

Unity,Arduino,RaspberryPiなど、モノづくり系を気ままに書き残すブログ。

Unity スクリプトから複数のシェーダーの値を一気に変更する


概要

シェーダーに記述したフォグの数値を、複数のオブジェクトで変更しようと、スクリプトにシーン内のマテリアルの数だけ繰り返すスクリプトを書いたのですが

どうやらそれよりもっとイージーな方法があったようです。

 

Shader.SetGlobalFloat("パラメータ名", 値 );

 

 

使い方

 

シーンにC#スクリプトをつくって

(毎フレームやりたければ)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に変更されます。

 

なので、シェーダーのプロパティ名が違う目的のものなのに、複数のシェーダーで被っていると意図せず変更されてしまうことになります。お気を付けください。