private static void SetProperties(MaterialPerInstanceProperties materialPerInstanceProperties, IList properties)
            {
                List <MaterialPerInstanceProperties.FloatProperty>   floatProperties   = new List <MaterialPerInstanceProperties.FloatProperty>();
                List <MaterialPerInstanceProperties.ColorProperty>   colorProperties   = new List <MaterialPerInstanceProperties.ColorProperty>();
                List <MaterialPerInstanceProperties.Vector4Property> vectorProperties  = new List <MaterialPerInstanceProperties.Vector4Property>();
                List <MaterialPerInstanceProperties.TextureProperty> textureProperties = new List <MaterialPerInstanceProperties.TextureProperty>();

                foreach (MaterialPerInstanceProperties.IProperty property in properties)
                {
                    if (property is MaterialPerInstanceProperties.FloatProperty)
                    {
                        floatProperties.Add((MaterialPerInstanceProperties.FloatProperty)property);
                    }
                    else if (property is MaterialPerInstanceProperties.ColorProperty)
                    {
                        colorProperties.Add((MaterialPerInstanceProperties.ColorProperty)property);
                    }
                    else if (property is MaterialPerInstanceProperties.Vector4Property)
                    {
                        vectorProperties.Add((MaterialPerInstanceProperties.Vector4Property)property);
                    }
                    else if (property is MaterialPerInstanceProperties.TextureProperty)
                    {
                        textureProperties.Add((MaterialPerInstanceProperties.TextureProperty)property);
                    }
                }

                materialPerInstanceProperties._floatProperties   = floatProperties.ToArray();
                materialPerInstanceProperties._colorProperties   = colorProperties.ToArray();
                materialPerInstanceProperties._vector4Properties = vectorProperties.ToArray();
                materialPerInstanceProperties._textureProperties = textureProperties.ToArray();
            }
            public override void OnInspectorGUI()
            {
                //Drop down list is all these
                MaterialPerInstanceProperties materialPerInstanceProperties = target as MaterialPerInstanceProperties;

                if (materialPerInstanceProperties == null)
                {
                    return;
                }

                GUILayout.Label("Per Instance Properties", EditorStyles.boldLabel);
                EditorGUILayout.PropertyField(serializedObject.FindProperty("_renderer"));

                if (materialPerInstanceProperties._renderer != null)
                {
                    _properties      = MaterialEditor.GetMaterialProperties(materialPerInstanceProperties._renderer.sharedMaterials);
                    _propertiesNames = new GUIContent[_properties.Length];
                    for (int i = 0; i < _properties.Length; i++)
                    {
                        _propertiesNames[i] = new GUIContent(_properties[i].displayName);
                    }

                    GUILayout.Space(3f);

                    _propertiesList.displayAdd    = _properties.Length > 0;
                    _propertiesList.displayRemove = true;
                    _propertiesList.list          = GetProperties(materialPerInstanceProperties);
                    _propertiesList.DoLayoutList();
                    SetProperties(materialPerInstanceProperties, _propertiesList.list);
                }

                serializedObject.ApplyModifiedProperties();
            }
            private static List <MaterialPerInstanceProperties.IProperty> GetProperties(MaterialPerInstanceProperties materialPerInstanceProperties)
            {
                List <MaterialPerInstanceProperties.IProperty> properties = new List <MaterialPerInstanceProperties.IProperty>();

                properties.AddRange(materialPerInstanceProperties._floatProperties);
                properties.AddRange(materialPerInstanceProperties._colorProperties);
                properties.AddRange(materialPerInstanceProperties._vector4Properties);
                properties.AddRange(materialPerInstanceProperties._textureProperties);

                return(properties);
            }