// // RemoveUnusedMaterialProperties.cs // http://light11.hatenadiary.com/entry/2018/12/04/224253 // #if UNITY_EDITOR using UnityEngine; using UnityEditor; public class Example { [MenuItem("CONTEXT/Material/Remove Unused Properties")] private static void RemoveUnusedMaterialProperties(MenuCommand menuCommand) { var material = menuCommand.context as Material; if (material == null) { return; } var so = new SerializedObject(material); so.Update(); var savedProp = so.FindProperty("m_SavedProperties"); // Tex Envs var texProp = savedProp.FindPropertyRelative("m_TexEnvs"); for (int i = texProp.arraySize - 1; i >= 0; i--) { var propertyName = texProp.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue; if (!material.HasProperty(propertyName)) { texProp.DeleteArrayElementAtIndex(i); } } // Floats var floatProp = savedProp.FindPropertyRelative("m_Floats"); for (int i = floatProp.arraySize - 1; i >= 0; i--) { var propertyName = floatProp.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue; if (!material.HasProperty(propertyName)) { floatProp.DeleteArrayElementAtIndex(i); } } // Colors var colorProp = savedProp.FindPropertyRelative("m_Colors"); for (int i = colorProp.arraySize - 1; i >= 0; i--) { var propertyName = colorProp.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue; if (!material.HasProperty(propertyName)) { colorProp.DeleteArrayElementAtIndex(i); } } so.ApplyModifiedProperties(); } } #endif