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(); 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