Unity Udexreal开发插件包
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.3 KiB

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace NaughtyAttributes.Editor
{
public abstract class SpecialCasePropertyDrawerBase
{
public bool OnGUI(Rect rect, NaughtyProperty naughtyProperty)
{
bool changeDetected = false;
// Check if visible
bool visible = PropertyUtility.IsVisible(naughtyProperty.showIfAttribute, naughtyProperty.serializedProperty);
if (!visible)
{
return false;
}
// Validate
ValidatorAttribute[] validatorAttributes = naughtyProperty.validatorAttributes;
foreach (var validatorAttribute in validatorAttributes)
{
validatorAttribute.GetValidator().ValidateProperty(naughtyProperty.serializedProperty);
}
// Check if enabled and draw
EditorGUI.BeginChangeCheck();
bool enabled = PropertyUtility.IsEnabled(naughtyProperty.readOnlyAttribute, naughtyProperty.enableIfAttribute, naughtyProperty.serializedProperty);
using (new EditorGUI.DisabledScope(disabled: !enabled))
{
OnGUI_Internal(rect, naughtyProperty.serializedProperty, PropertyUtility.GetLabel(naughtyProperty.labelAttribute, naughtyProperty.serializedProperty));
}
// Call OnValueChanged callbacks
if (EditorGUI.EndChangeCheck())
{
changeDetected = true;
PropertyUtility.CallOnValueChangedCallbacks(naughtyProperty.serializedProperty);
}
return changeDetected;
}
public float GetPropertyHeight(SerializedProperty property)
{
return GetPropertyHeight_Internal(property);
}
protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label);
protected abstract float GetPropertyHeight_Internal(SerializedProperty property);
}
public static class SpecialCaseDrawerAttributeExtensions
{
private static Dictionary<Type, SpecialCasePropertyDrawerBase> _drawersByAttributeType;
static SpecialCaseDrawerAttributeExtensions()
{
_drawersByAttributeType = new Dictionary<Type, SpecialCasePropertyDrawerBase>();
_drawersByAttributeType[typeof(ReorderableListAttribute)] = ReorderableListPropertyDrawer.Instance;
}
public static SpecialCasePropertyDrawerBase GetDrawer(this SpecialCaseDrawerAttribute attr)
{
SpecialCasePropertyDrawerBase drawer;
if (_drawersByAttributeType.TryGetValue(attr.GetType(), out drawer))
{
return drawer;
}
else
{
return null;
}
}
}
}