237 lines
9.7 KiB
C#
237 lines
9.7 KiB
C#
using UnityEditor;
|
||
using UnityEngine;
|
||
using UnityEditor.Experimental.GraphView;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
|
||
// #if UNITY_EDITOR
|
||
[CustomEditor(typeof(MaterialPropertyAgent))]
|
||
public class MaterialPropertyAgentInspector : UnityEditor.Editor
|
||
{
|
||
private MaterialPropertyAgent agent;
|
||
|
||
private void OnEnable()
|
||
{
|
||
agent = (MaterialPropertyAgent)target;
|
||
}
|
||
|
||
private GUIContent materialIndexContent = new GUIContent("材质序号:", "只有模型模式下需要使用,谨慎修改");
|
||
public override void OnInspectorGUI()
|
||
{
|
||
serializedObject.Update();
|
||
EditorGUI.BeginChangeCheck();
|
||
if (!agent.isGetByComponet)
|
||
{
|
||
EditorGUILayout.PropertyField(serializedObject.FindProperty("customRenderer"),new GUIContent("指定Renderer"));
|
||
}
|
||
if (agent.isRendererMode)
|
||
{
|
||
EditorGUILayout.BeginHorizontal();
|
||
int lastIndex = agent.materialIndex;
|
||
agent.materialIndex = EditorGUILayout.IntField(materialIndexContent ,agent.materialIndex);
|
||
if (lastIndex != agent.materialIndex)
|
||
{
|
||
agent.initMatAndShaderByMaterialIndexChange();
|
||
}
|
||
EditorGUILayout.LabelField("材质名:"+agent.mat.name+"\t"+"Shader名:"+agent.shader.name);
|
||
EditorGUILayout.EndHorizontal();
|
||
}
|
||
|
||
DrawPropertyData(ref agent.data0, "Data0", serializedObject.FindProperty("data0"));
|
||
DrawPropertyData(ref agent.data1, "Data1", serializedObject.FindProperty("data1"));
|
||
DrawPropertyData(ref agent.data2, "Data2", serializedObject.FindProperty("data2"));
|
||
DrawPropertyData(ref agent.data3, "Data3", serializedObject.FindProperty("data3"));
|
||
DrawPropertyData(ref agent.data4, "Data4", serializedObject.FindProperty("data4"));
|
||
DrawPropertyData(ref agent.data5, "Data5", serializedObject.FindProperty("data5"));
|
||
EditorGUILayout.BeginHorizontal();
|
||
if (GUILayout.Button("添加"))
|
||
{
|
||
agent.addProperteData();
|
||
}
|
||
if (GUILayout.Button("全部删除"))
|
||
{
|
||
agent.removeAllProperty();
|
||
}
|
||
EditorGUILayout.EndHorizontal();
|
||
serializedObject.ApplyModifiedProperties();
|
||
if (EditorGUI.EndChangeCheck())
|
||
{
|
||
PrefabUtility.RecordPrefabInstancePropertyModifications(agent);
|
||
if (!agent.isGetByComponet && agent.mat)
|
||
{
|
||
if(matEditor) DestroyImmediate(matEditor);
|
||
matEditor = (MaterialEditor)CreateEditor(agent.mat);
|
||
}
|
||
}
|
||
|
||
if (!agent.isGetByComponet && agent.mat)
|
||
{
|
||
DrawMaterialInspector(matEditor,agent.mat);
|
||
}
|
||
}
|
||
|
||
void DrawPropertyData(ref MaterialPropertyAgent.PropertyData data, string dataLabel, SerializedProperty property)
|
||
{
|
||
EditorGUI.BeginProperty(EditorGUILayout.GetControlRect(false, 0f), GUIContent.none, property);
|
||
if (data.isActive)
|
||
{
|
||
EditorGUILayout.LabelField(dataLabel, EditorStyles.boldLabel);
|
||
|
||
EditorGUI.indentLevel++;
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
float originLabelWidth = EditorGUIUtility.labelWidth;
|
||
EditorGUIUtility.labelWidth = 80;
|
||
// data.index = EditorGUILayout.Popup("属性名:", data.index, agent.shaderPropNameArr);
|
||
// data.index = EditorGUILayout.Popup("属性名:", data.index, agent.shaderPropDescripArr);
|
||
// string dataDesript = data.descripName;
|
||
if (GUILayout.Button(data.descripName, EditorStyles.popup))
|
||
{
|
||
int dataIndexInAgent = data.dataIndexInAgent;
|
||
|
||
StringListSerchProvider provider = ScriptableObject.CreateInstance<StringListSerchProvider>();
|
||
provider.Initialize(agent.shaderPropDescripsForSerch, (x) =>
|
||
{
|
||
if (x != null)
|
||
{
|
||
AfterShaderPropSerch(dataIndexInAgent,x);
|
||
}
|
||
});
|
||
SearchWindow.Open(new SearchWindowContext(GUIUtility.GUIToScreenPoint(Event.current.mousePosition)), provider);
|
||
// SearchWindow.Open(new SearchWindowContext(GUIUtility.GUIToScreenPoint(Event.current.mousePosition)),
|
||
// new StringListSerchProvider(agent.shaderPropDescripsForSerch, (x) =>
|
||
// {
|
||
// if (x != null)
|
||
// {
|
||
// AfterShaderPropSerch(dataIndexInAgent,x);
|
||
// }
|
||
// }));
|
||
}
|
||
|
||
|
||
|
||
EditorGUILayout.LabelField("属性类型:", data.type.ToString());
|
||
|
||
EditorGUILayout.EndHorizontal();
|
||
EditorGUIUtility.labelWidth = originLabelWidth;
|
||
switch (data.type)
|
||
{
|
||
case MaterialPropertyAgent.shaderPropertyType.Color:
|
||
SerializedProperty colorProp = property.FindPropertyRelative("colorValue");
|
||
if (data.descripName.ToLower().Contains("hdr"))
|
||
{
|
||
colorProp.colorValue = EditorGUILayout.ColorField(new GUIContent(data.propName + " :") , colorProp.colorValue,true,true,true);
|
||
}
|
||
else
|
||
{
|
||
colorProp.colorValue = EditorGUILayout.ColorField(data.propName + " :", colorProp.colorValue);
|
||
}
|
||
break;
|
||
case MaterialPropertyAgent.shaderPropertyType.Vector:
|
||
case MaterialPropertyAgent.shaderPropertyType.TexEnv:
|
||
SerializedProperty vecProp = property.FindPropertyRelative("vecValue");
|
||
if (data.type == MaterialPropertyAgent.shaderPropertyType.Vector)
|
||
{
|
||
vecProp.vector4Value = EditorGUILayout.Vector4Field(data.propName + " :", vecProp.vector4Value);
|
||
}
|
||
else if (data.type == MaterialPropertyAgent.shaderPropertyType.TexEnv)
|
||
{
|
||
vecProp.vector4Value = EditorGUILayout.Vector4Field(data.propName + ":", vecProp.vector4Value);
|
||
|
||
}
|
||
break;
|
||
case MaterialPropertyAgent.shaderPropertyType.Float:
|
||
case MaterialPropertyAgent.shaderPropertyType.Range:
|
||
SerializedProperty floatProp = property.FindPropertyRelative("floatValue");
|
||
if (data.type == MaterialPropertyAgent.shaderPropertyType.Float)
|
||
{
|
||
floatProp.floatValue = EditorGUILayout.FloatField(data.propName + ":", floatProp.floatValue);
|
||
}
|
||
else if (data.type == MaterialPropertyAgent.shaderPropertyType.Range)
|
||
{
|
||
floatProp.floatValue = EditorGUILayout.Slider(data.propName + ":", floatProp.floatValue, data.rangMin, data.rangMax);
|
||
|
||
}
|
||
break;
|
||
|
||
}
|
||
|
||
if (GUILayout.Button("删除", new[] { GUILayout.Width(200) }))
|
||
{
|
||
data.isActive = false;
|
||
}
|
||
EditorGUI.indentLevel--;
|
||
// EditorGUILayout.Space();
|
||
}
|
||
EditorGUI.EndProperty();
|
||
}
|
||
|
||
//因为Action不能有Ref。所以有了这个丑陋的HardCode
|
||
public void AfterShaderPropSerch(int dataIndexInAgent, string propertyDesrpt)
|
||
{
|
||
switch (dataIndexInAgent)
|
||
{
|
||
case 0:
|
||
AfterShaderPropSerch(ref agent.data0,propertyDesrpt);
|
||
break;
|
||
case 1:
|
||
AfterShaderPropSerch(ref agent.data1,propertyDesrpt);
|
||
break;
|
||
case 2:
|
||
AfterShaderPropSerch(ref agent.data2,propertyDesrpt);
|
||
break;
|
||
case 3:
|
||
AfterShaderPropSerch(ref agent.data3,propertyDesrpt);
|
||
break;
|
||
case 4:
|
||
AfterShaderPropSerch(ref agent.data4,propertyDesrpt);
|
||
break;
|
||
case 5:
|
||
AfterShaderPropSerch(ref agent.data5,propertyDesrpt);
|
||
break;
|
||
|
||
|
||
}
|
||
}
|
||
|
||
public void AfterShaderPropSerch(ref MaterialPropertyAgent.PropertyData data, string propertyDesrpt)
|
||
{
|
||
int preservedIndex = data.index;
|
||
// string propname = data.propName;
|
||
data.index = Array.FindIndex(agent.shaderPropDescripArr, x=> x.Equals(propertyDesrpt) );
|
||
// Debug.Log();
|
||
if (preservedIndex != data.index)//证明用户进行了更改
|
||
{
|
||
if (!agent.isCanUsedIndex(data.index))
|
||
{
|
||
//TODO给一个报错提示
|
||
Debug.LogError("材质属性已经存在:" + ShaderUtil.GetPropertyDescription(agent.shader, data.index));
|
||
data.index = agent.getCanUsedIndex();
|
||
}
|
||
//此处进行内容刷新
|
||
data.setValueByPropChange();
|
||
}
|
||
}
|
||
|
||
private MaterialEditor matEditor;
|
||
void DrawMaterialInspector(MaterialEditor editor,Material mat)
|
||
{
|
||
if (editor != null && mat != null)
|
||
{
|
||
// Draw the material's foldout and the material shader field
|
||
// Required to call _materialEditor.OnInspectorGUI ();
|
||
editor.DrawHeader();
|
||
// We need to prevent the user to edit Unity default materials
|
||
bool isDefaultMaterial = !AssetDatabase.GetAssetPath (mat).StartsWith ("Assets");
|
||
using (new EditorGUI.DisabledGroupScope(isDefaultMaterial)) {
|
||
|
||
// Draw the material properties
|
||
// Works only if the foldout of _materialEditor.DrawHeader () is open
|
||
editor.OnInspectorGUI ();
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
// #endif
|