forked from Shardstone/trail-into-darkness
54 lines
2.0 KiB
C#
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 |