From 51223864a6799cdb8ff38f6e9ac73a4b1215f6fd Mon Sep 17 00:00:00 2001 From: Hubert Mattusch Date: Tue, 13 Sep 2022 22:41:19 +0200 Subject: [PATCH] Add RequireInterface attribute --- RequireInterface.meta | 8 ++++ RequireInterface/Editor.meta | 8 ++++ .../Editor/RequireInterfaceDrawer.cs | 41 +++++++++++++++++++ .../Editor/RequireInterfaceDrawer.cs.meta | 11 +++++ .../RequireInterfaceAttribute.cs | 0 .../RequireInterfaceAttribute.cs.meta | 11 +++++ 6 files changed, 79 insertions(+) create mode 100644 RequireInterface.meta create mode 100644 RequireInterface/Editor.meta create mode 100644 RequireInterface/Editor/RequireInterfaceDrawer.cs create mode 100644 RequireInterface/Editor/RequireInterfaceDrawer.cs.meta rename RequireInterfaceAttribute.cs => RequireInterface/RequireInterfaceAttribute.cs (100%) create mode 100644 RequireInterface/RequireInterfaceAttribute.cs.meta diff --git a/RequireInterface.meta b/RequireInterface.meta new file mode 100644 index 0000000..f1a1fa6 --- /dev/null +++ b/RequireInterface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: da80835a1611a5e4d908f51f09e8d3bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/RequireInterface/Editor.meta b/RequireInterface/Editor.meta new file mode 100644 index 0000000..89239d9 --- /dev/null +++ b/RequireInterface/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 849242dbc213969488426f85222a43a9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/RequireInterface/Editor/RequireInterfaceDrawer.cs b/RequireInterface/Editor/RequireInterfaceDrawer.cs new file mode 100644 index 0000000..dfdd4f2 --- /dev/null +++ b/RequireInterface/Editor/RequireInterfaceDrawer.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using UnityEditor; +/// +/// Drawer for the RequireInterface attribute. +/// +[CustomPropertyDrawer(typeof(RequireInterfaceAttribute))] +public class RequireInterfaceDrawer : PropertyDrawer +{ + /// + /// Overrides GUI drawing for the attribute. + /// + /// Position. + /// Property. + /// Label. + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + // Check if this is reference type property. + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + // Get attribute parameters. + var requiredAttribute = this.attribute as RequireInterfaceAttribute; + // Begin drawing property field. + EditorGUI.BeginProperty(position, label, property); + // Draw property field. + property.objectReferenceValue = EditorGUI.ObjectField(position, label, property.objectReferenceValue, requiredAttribute.requiredType, true); + // Finish drawing property field. + EditorGUI.EndProperty(); + } + else + { + // If field is not reference, show error message. + // Save previous color and change GUI to red. + var previousColor = GUI.color; + GUI.color = Color.red; + // Display label with error message. + EditorGUI.LabelField(position, label, new GUIContent("Property is not a reference type")); + // Revert color change. + GUI.color = previousColor; + } + } +} \ No newline at end of file diff --git a/RequireInterface/Editor/RequireInterfaceDrawer.cs.meta b/RequireInterface/Editor/RequireInterfaceDrawer.cs.meta new file mode 100644 index 0000000..9c4855e --- /dev/null +++ b/RequireInterface/Editor/RequireInterfaceDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b430a75a32f8e534f8661d364d842691 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/RequireInterfaceAttribute.cs b/RequireInterface/RequireInterfaceAttribute.cs similarity index 100% rename from RequireInterfaceAttribute.cs rename to RequireInterface/RequireInterfaceAttribute.cs diff --git a/RequireInterface/RequireInterfaceAttribute.cs.meta b/RequireInterface/RequireInterfaceAttribute.cs.meta new file mode 100644 index 0000000..868885f --- /dev/null +++ b/RequireInterface/RequireInterfaceAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29f2a6e637914fe4292225071a7c5157 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: