UnityGame/Library/PackageCache/com.unity.render-pipelines.core/Editor/RelativePropertiesDrawer.cs

68 lines
2.7 KiB
C#
Raw Permalink Normal View History

2024-10-27 10:53:47 +03:00
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.Rendering
{
/// <summary>
/// Custom property drawer that renders automatically a set of properties of a given object
/// </summary>
public abstract class RelativePropertiesDrawer : PropertyDrawer
{
/// <summary>
/// The set of properties to draw the default <see cref="PropertyDrawer"/>.
/// </summary>
protected abstract string[] relativePropertiesNames { get; }
/// <inheritdoc/>
public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
var container = new VisualElement();
for (int i = 0; i < relativePropertiesNames.Length; ++i)
{
var relativeProperty = property.FindPropertyRelative(relativePropertiesNames[i]);
if (relativeProperty == null)
continue;
container.Add(new PropertyField(relativeProperty));
}
return container;
}
/// <inheritdoc/>
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
Rect? rect = null;
for (int i = 0; i < relativePropertiesNames.Length; ++i)
{
var relativeProperty = property.FindPropertyRelative(relativePropertiesNames[i]);
if (relativeProperty == null)
continue;
var height = EditorGUI.GetPropertyHeight(relativeProperty, true) +
EditorGUIUtility.standardVerticalSpacing;
rect = rect != null ?
new Rect(rect.Value.x, rect.Value.y + rect.Value.height + EditorGUIUtility.standardVerticalSpacing, rect.Value.width, height) :
new Rect(position.x, position.y + EditorGUIUtility.standardVerticalSpacing, position.width, height);
EditorGUI.PropertyField(rect.Value, relativeProperty);
}
EditorGUI.EndProperty();
}
/// <inheritdoc/>
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
float height = EditorGUIUtility.standardVerticalSpacing;
for (int i = 0; i < relativePropertiesNames.Length; ++i)
{
var relativeProperty = property.FindPropertyRelative(relativePropertiesNames[i]);
if (relativeProperty == null)
continue;
height += EditorGUI.GetPropertyHeight(relativeProperty, true) + EditorGUIUtility.standardVerticalSpacing;
}
return height;
}
}
}