| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 | using System.Linq;using UnityEditor;using UnityEngine;namespace UnityUIPlayables.Editor{    [CustomPropertyDrawer(typeof(MultiPropertyAttribute), true)]    public class MultiPropertyAttributeDrawer : PropertyDrawer    {        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)        {            var attributes = GetAttributes();            var propertyDrawers = GetPropertyDrawers();            if (attributes.Any(attr => !attr.IsVisible(property)))            {                return;            }            foreach (var attr in attributes)            {                attr.OnPreGUI(position, property);            }            using (var ccs = new EditorGUI.ChangeCheckScope())            {                if (propertyDrawers.Length == 0)                {                    EditorGUI.PropertyField(position, property, label, true);                }                else                {                    propertyDrawers.Last().OnGUI(position, property, label);                }                foreach (var attr in attributes.Reverse())                {                    attr.OnPostGUI(position, property, ccs.changed);                }            }        }        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)        {            var attributes = GetAttributes();            var propertyDrawers = GetPropertyDrawers();            if (attributes.Any(attr => !attr.IsVisible(property)))            {                return -EditorGUIUtility.standardVerticalSpacing;            }            var height = propertyDrawers.Length == 0                ? EditorGUI.GetPropertyHeight(property, label, true)                : propertyDrawers.Last().GetPropertyHeight(property, label);            return height;        }        private MultiPropertyAttribute[] GetAttributes()        {            var attr = (MultiPropertyAttribute) attribute;            if (attr.Attributes == null)            {                attr.Attributes = fieldInfo                    .GetCustomAttributes(typeof(MultiPropertyAttribute), false)                    .Cast<MultiPropertyAttribute>()                    .OrderBy(x => x.order)                    .ToArray();            }            return attr.Attributes;        }        private IAttributePropertyDrawer[] GetPropertyDrawers()        {            var attr = (MultiPropertyAttribute) attribute;            if (attr.PropertyDrawers == null)            {                attr.PropertyDrawers = fieldInfo                    .GetCustomAttributes(typeof(MultiPropertyAttribute), false)                    .OfType<IAttributePropertyDrawer>()                    .OrderBy(x => ((MultiPropertyAttribute) x).order)                    .ToArray();            }            return attr.PropertyDrawers;        }    }}
 |