読者です 読者をやめる 読者になる 読者になる

Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

スクリプトからShaderパラメータを変更する(例:_EmissionColorについて)

Shaderのプロパティを変更するには、materialのメソッド、SetColor(), SetFloat(), SetInt(), SetTexture()を使う。( Unity - マニュアル: スクリプトを使用したマテリアルパラメーターへのアクセスと変更

それぞれのメソッドは、たとえば、SetFloat(シェーダプロパティ名, 値)という形をとる。

シェーダープロパティ名は、それぞれのシェーダに依存する。どんなシェーダプロパティがあるかは、Materialコンポーネントで、"Edit Shader..."を選択すればよい。

f:id:yasuda0404:20160730125025p:plain

UnityのStandard Shaderのプロパティは次の通り。

f:id:yasuda0404:20160730125345p:plain

ちなみに、"Compile and show code"をクリックすると、Shaderを編集できる。

たとえば、'_EmissionColor'は、'Color:Color'となっているので、

GetComponent<Renderer>().material = SetColor("_EmissionColor", Color.red)

のようにすればいい。

指定するShaderプロパティが存在しない場合は無視されるようだが、プロパティが存在するかどうかをチェックしてから値を設定したほうが、スクリプトとしてはよりロバスト。これは、material.HasProperty()を使う。

myMat = GetComponent<Renderer>().material;
if (myMat.HasProperty("_EmissionColor")) {
    myMat.SetColor("_EmissionColor", Color.black);
}

ここでひとつ疑問が。

今回は、「点滅するインジケータ」をEmissionの'Intensity'―Inspectorでは、下のEmissionのカラーボックスの右にある数字(現在1)―を上下して実現しようと考えた。しかし、Shaerプロパティに、Emission Intensityに相当するものが見当たらない。

f:id:yasuda0404:20160730130337p:plain

どうも、Emissionの強度の数字は、_EmissionColorのA(アルファ)値のようだ。

そこで、次のようなスクリプトを組むと、無事「1秒周期で点滅するインジケータ」ができた。('1.0f-val*val'の部分は、点滅パタンによって変更すればいい)

    void Update () {
        float val = Mathf.PingPong(Time.time, 1.0F);
        Color color = new Color(0f, 1.0f - val*val, 0f);    //Green + Alpha-Channel
        myMat.SetColor("_EmissionColor", color);
    }