#if UNITY_2019_1_OR_NEWER using UnityEditor; using UnityEngine; namespace UnityAtoms.Editor { public abstract class AtomDrawer : PropertyDrawer where T : ScriptableObject { private bool _userClickedToCreateAtom = false; private string _nameOfNewAtom = ""; private string _warningText = ""; public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { var isCreatingSO = _userClickedToCreateAtom && property.objectReferenceValue == null; if (!isCreatingSO || _warningText.Length <= 0) return base.GetPropertyHeight(property, label); return base.GetPropertyHeight(property, label) * 2 + 4f; } public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var isCreatingSO = _userClickedToCreateAtom && property.objectReferenceValue == null; var restWidth = _userClickedToCreateAtom ? 50 : 58; var gutter = _userClickedToCreateAtom ? 2f : 6f; Rect restRect = new Rect(); Rect warningRect = new Rect(); EditorGUI.BeginProperty(position, label, property); if (_warningText.Length > 0) { position = IMGUIUtils.SnipRectV(position, EditorGUIUtility.singleLineHeight, out warningRect, 2f); } if (property.objectReferenceValue == null) { position = IMGUIUtils.SnipRectH(position, position.width - restWidth, out restRect, gutter); } var defaultGUIColor = GUI.color; GUI.color = isCreatingSO ? Color.yellow : defaultGUIColor; position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), isCreatingSO ? new GUIContent("Name of New Atom") : label); GUI.color = defaultGUIColor; if (isCreatingSO) { _nameOfNewAtom = EditorGUI.TextField(position, _nameOfNewAtom); } else { property.objectReferenceValue = EditorGUI.ObjectField(position, property.objectReferenceValue, typeof(T), false); } if (property.objectReferenceValue == null) { if (isCreatingSO) { var buttonWidth = 24; Rect secondButtonRect; Rect firstButtonRect = IMGUIUtils.SnipRectH(restRect, restRect.width - buttonWidth, out secondButtonRect, gutter); if (GUI.Button(firstButtonRect, "✓")) { if (_nameOfNewAtom.Length > 0) { try { // Create asset T so = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(so, "Assets/" + _nameOfNewAtom + ".asset"); AssetDatabase.SaveAssets(); // Assign the newly created SO property.objectReferenceValue = so; } catch { Debug.LogError("Not able to create Atom"); } _userClickedToCreateAtom = false; _warningText = ""; } else { _warningText = "Name of new Atom must be specified!"; } } if (GUI.Button(secondButtonRect, "✗")) { _userClickedToCreateAtom = false; _warningText = ""; } if (_warningText.Length > 0) { EditorGUI.HelpBox(warningRect, _warningText, MessageType.Warning); } } else { if (GUI.Button(restRect, "Create")) { _nameOfNewAtom = ""; _userClickedToCreateAtom = true; } } } EditorGUI.EndProperty(); } } // Events [CustomPropertyDrawer(typeof(BoolEvent))] public class BoolEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(ColliderEvent))] public class ColliderEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Collider2DEvent))] public class Collider2DEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(ColorEvent))] public class ColorEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(FloatEvent))] public class FloatEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(GameObjectEvent))] public class GameObjectEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(IntEvent))] public class IntEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(StringEvent))] public class StringEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector2Event))] public class Vector2EventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector3Event))] public class Vector3EventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(VoidEvent))] public class VoidEventDrawer : AtomDrawer { } // Event x 2 [CustomPropertyDrawer(typeof(BoolBoolEvent))] public class BoolBoolEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(ColorColorEvent))] public class ColorColorEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(FloatFloatEvent))] public class FloatFloatEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(GameObjectGameObjectEvent))] public class GameObjectGameObjectEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(IntIntEvent))] public class IntIntEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(StringStringEvent))] public class StringStringEventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector2Vector2Event))] public class Vector2Vector2EventDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector3Vector3Event))] public class Vector3Vector3EventDrawer : AtomDrawer { } // Constants [CustomPropertyDrawer(typeof(BoolConstant))] public class BoolConstantDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(ColorConstant))] public class ColorConstantDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(FloatConstant))] public class FloatConstantDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(IntConstant))] public class IntConstantDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(StringConstant))] public class StringConstantDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector2Constant))] public class Vector2ConstantDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector3Constant))] public class Vector3ConstantDrawer : AtomDrawer { } // Lists [CustomPropertyDrawer(typeof(BoolList))] public class BoolListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Collider2DList))] public class Collider2DListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(ColorList))] public class ColorListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(FloatList))] public class FloatListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(GameObjectList))] public class GameObjectListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(IntList))] public class IntListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(StringList))] public class StringListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector2List))] public class Vector2ListDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector3List))] public class Vector3ListDrawer : AtomDrawer { } // Variables [CustomPropertyDrawer(typeof(BoolVariable))] public class BoolVariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(ColorVariable))] public class ColorVariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(FloatVariable))] public class FloatVariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(GameObjectVariable))] public class GameObjectVariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(IntVariable))] public class IntVariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(StringVariable))] public class StringVariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector2Variable))] public class Vector2VariableDrawer : AtomDrawer { } [CustomPropertyDrawer(typeof(Vector3Variable))] public class Vector3VariableDrawer : AtomDrawer { } } #endif