static void ApplyBlendMode(Material material, ブレンドモード mode) { switch (mode) { case ブレンドモード.透明: material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry; material.SetOverrideTag("RenderType", "Opaque"); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.DisableKeyword("_ALPHATEST_ON"); // #ifdef _ALPHATEST_ON の切り替え break; case ブレンドモード.カットオフ: material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest; material.SetOverrideTag("RenderType", "TransparentCutout"); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.EnableKeyword("_ALPHATEST_ON"); // αテストする break; case ブレンドモード.半透明: material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); // 内挿 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.SetInt("_ZWrite", 0); // 深度書き込みしない material.DisableKeyword("_ALPHATEST_ON"); break; default: throw new ArgumentOutOfRangeException("blendMode", mode, null); } }
// インスペクタの描画 public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) { ブレンドモード mode = DrawBlendMode(materialEditor, properties);// ブレンドモードはいろいろするので別関数 // カットオフの時だけ、カットオフの閾値調整を表示する if (mode == ブレンドモード.カットオフ) { var cutoff = FindProperty("_Cutoff", properties); materialEditor.ShaderProperty(cutoff, cutoff.displayName); } var mainTex = FindProperty("_MainTex", properties); materialEditor.ShaderProperty(mainTex, mainTex.displayName);// テクスチャの設定 var Color = FindProperty("_Color", properties); materialEditor.ShaderProperty(Color, Color.displayName); // 色の設定 materialEditor.RenderQueueField(); // 描画順を決めるキューの設定 }