因为编辑器大量工作都是判断某个贴图是否存在进而对keywords进行操作,参考StandardShaderGUI 实现。
public class MagicStandCustomGUI : ShaderGUI
{
MaterialEditor m_MaterialEditor;
bool m_FirstTimeApply = true;
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
{
m_MaterialEditor = materialEditor;
Material material = materialEditor.target as Material;
if (m_FirstTimeApply)
{
MaterialChanged(material);
m_FirstTimeApply = false;
base.OnGUI(materialEditor, props);
}
else
{
EditorGUI.BeginChangeCheck();
base.OnGUI(materialEditor, props);
if (EditorGUI.EndChangeCheck())
{
MaterialChanged(material);
}
}
}
static void MaterialChanged(Material material)
{
SetMaterialKeywords(material);
}
public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
{
MaterialChanged(material);
}
static void SetMaterialKeywords(Material material)
{
SetKeyword(material, "_NORMALMAP", material.GetTexture("_NormalTex"));
SetKeyword(material, "_MetallicTex", material.GetTexture("_MetallicTex"));
SetKeyword(material, "_EmissionTex", material.GetTexture("_EmissionTex"));
SetKeyword(material, "_ParallaxMap", material.GetTexture("_ParallaxMap"));
}
static void SetKeyword(Material m, string keyword, bool state)
{
Debug.Log("SetKeyword "+keyword+"_"+state);
if (state)
m.EnableKeyword(keyword);
else
m.DisableKeyword(keyword);
}
}