強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Custom Material Editors のサンプルを作ってみた

Unity - Custom Material Editors
http://docs.unity3d.com/Documentation/Components/SL-CustomMaterialEditors.html

公式のドキュメントのこのサンプルを作成してみました。

実行してみると Material を選択した時にこの様に拡張されていました。「Redify material」の部分が拡張された所です。

このチェックボックスにチェックが付いている状態ではこの様なレンダリング結果になります。

チェックが外れている状態ではこの様なレンダリング結果になります。

チェックが付いている時は緑と青の色が暗くなり、赤が強調されたレンダリング結果に成っているのが確認できるかと思います。

Custom Material Editors ではこの様に Inspector で Shader の内容を切り替える機能拡張を行えます。

コード

【CustomMaterialInspector.cs】

 using System.Collections.Generic;
 using UnityEngine;
 using UnityEditor;
 using System.Linq;
 
public class CustomMaterialInspector : MaterialEditor
{
	public override void OnInspectorGUI ()
	{
		// render the default inspector
		base.OnInspectorGUI ();
 
		// if we are not visible... return
		if (!isVisible)
			return;
 
		// get the current keywords from the material
		Material targetMat = target as Material;
		string[] keyWords = targetMat.shaderKeywords;
 
		// see if redify is set, then show a checkbox
		//   Material の Shader に キーワード (定数)  REDIFY_ON が存在するかを bool で取得
		bool redify = keyWords.Contains ("REDIFY_ON");
		EditorGUI.BeginChangeCheck ();
		//  ここの記述が Inspector に反映される。今回は「Redify material」という名前のトグル(bool)のデータ
		redify = EditorGUILayout.Toggle ("Redify material", redify);
		if (EditorGUI.EndChangeCheck ()) {
			// if the checkbox is changed, reset the shader keywords
			//  チェックボックスの状態でShader内のキーワード (定数)を REDIFY_ON にするか REDIFY_OFF にするかを切り替える
			var keywords = new List<string> { redify ? "REDIFY_ON" : "REDIFY_OFF"};
			targetMat.shaderKeywords = keywords.ToArray ();
			EditorUtility.SetDirty (targetMat);
		}
	}
}

【RedifyShader.shader】

Shader "Custom/Redify" {
 	Properties {
 		_MainTex ("Base (RGB)", 2D) = "white" {}
 	}
 	SubShader {
 		Tags { "RenderType"="Opaque" }
 		LOD 200
 
 		CGPROGRAM
 		#pragma surface surf Lambert
 		#pragma multi_compile REDIFY_ON REDIFY_OFF
 
 		sampler2D _MainTex;
 
 		struct Input {
 			float2 uv_MainTex;
 		};
 
 		void surf (Input IN, inout SurfaceOutput o) {
 			half4 c = tex2D (_MainTex, IN.uv_MainTex);
 			o.Albedo = c.rgb;
 			o.Alpha = c.a;
 
 #if REDIFY_ON
 			o.Albedo.gb = (o.Albedo.g + o.Albedo.b) / 2.0;
 #endif
 		}
 		ENDCG
 	} 
 	FallBack "Diffuse"
 	CustomEditor "CustomMaterialInspector"
 }

以下の部分で CustomMaterialInspector.cs と関連付けられています。

 	CustomEditor "CustomMaterialInspector"

関連情報

Unity - ShaderLab syntax: CustomEditor
http://docs.unity3d.com/Documentation/Components/SL-CustomEditor.html