Files
trail-into-darkness/Packages/com.jovian.inspector/Editor/Attributes/OptionalAttribute.cs
2026-03-29 18:59:24 +02:00

54 lines
2.0 KiB
C#

using UnityEditor;
using UnityEngine;
namespace InspectorToolkit {
public class OptionalAttribute : PropertyAttribute { }
}
#if UNITY_EDITOR
namespace InspectorToolkit.Internal {
[CustomPropertyDrawer(typeof(OptionalAttribute))]
public class OptionalAttributePropertyDrawer : PropertyDrawer {
private const float ICON_X_OFFSET = 17f;
private const float ICON_SIZE = 18f;
private GUIContent icon;
private GUIStyle style;
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
if (property.propertyType != SerializedPropertyType.ObjectReference) {
Debug.LogError($"Optional should only be used on Unity Object references. Target='{property.serializedObject.targetObject.name}.{property.propertyPath}'");
EditorGUI.PropertyField(position, property, label);
return;
}
if(icon == null || style == null) {
icon = new GUIContent(EditorGUIUtility.IconContent("DotFrameDotted").image, "Optional");
style = new GUIStyle(GUI.skin.label)
{
padding = new RectOffset(0, 0, 0, 0),
imagePosition = ImagePosition.ImageOnly
};
}
if(property.objectReferenceValue == null) {
Rect iconRect = new Rect(position.x - ICON_X_OFFSET, position.y + 1, ICON_SIZE, EditorGUIUtility.singleLineHeight);
GUI.Label(iconRect, icon, style);
}
label = EditorGUI.BeginProperty(position, label, property);
position = EditorGUI.PrefixLabel(position, label);
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(position, property, GUIContent.none);
if(EditorGUI.EndChangeCheck()) {
property.serializedObject.ApplyModifiedProperties();
}
EditorGUI.EndProperty();
}
}
}
#endif