【Unity】【シェーダ】RenderTypeをスクリプトから変更する

RenderTypeをスクリプトから変更する方法です。
Standardシェーダのように不透明や半透明をエディタから切り替える機能をつけるときなどに便利です。

f:id:halya_11:20180525125334p:plain

Material.SetOverrideTag

RenderTypeを書き換えるにはMaterial.SetOverrideTag()を使います。
これはRenderTypeに限らずタグを動的に書き換えるためのメソッドです。

docs.unity3d.com

これを使って下記のようにスクリプトで制御します。

using UnityEngine;

public class CustomRenderType : MonoBehaviour {

    [SerializeField]
    private bool _isTransparent = false;

    private void Awake () {
        var renderType = _isTransparent ? "Transparent" : "Opaque";
        GetComponent<MeshRenderer>().material.SetOverrideTag ("RenderType", renderType);
    }
}

これでひとまずRenderTypeが書き換えられました。
何のタグがオーバーライドされているかは、インスペクタをDebugモードにしてマテリアルのString Tag Mapを見るとわかります。

f:id:halya_11:20180525125833p:plain

RenderQueueも変える

さて、RenderTypeを変えたらQueueも変更しないといけません。
スクリプトからQueueを変更するにはCustom Render Queueを使います。

light11.hatenadiary.com

スクリプトは次のように変更します。

using UnityEngine;
using UnityEngine.Rendering;

public class CustomRenderType : MonoBehaviour {

    [SerializeField]
    private bool _isTransparent = false;

    private void Awake () {
        var material = GetComponent<MeshRenderer>().material;
        var renderType = _isTransparent ? "Transparent" : "Opaque";
        var renderQueue = _isTransparent ? (int)RenderQueue.Transparent : (int)RenderQueue.Geometry;
        material.SetOverrideTag ("RenderType", renderType);
        material.renderQueue = renderQueue;
    }
}

これで動的に変更することができました。

関連

light11.hatenadiary.com