diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index ee402a9..b93a1cc 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -714,48 +714,48 @@ namespace DCFApixels.DragonECS.Unity.Editors { return DrawTypeMetaBlockPadding * 2 + contentHeight; } - public static bool DrawTypeMetaElementBlock(ref Rect position, SerializedProperty arrayProperty, int elementIndex, SerializedProperty elementRootProperty, ITypeMeta meta) + + public static bool DrawTypeMetaElementBlock(ref Rect rect, SerializedProperty arrayProperty, int elementIndex, SerializedProperty elementRootProperty, ITypeMeta meta) { - var result = DrawTypeMetaBlock_Internal(ref position, elementRootProperty, meta, elementIndex, arrayProperty.arraySize); - if (result.HasFlag(DrawTypeMetaBlockResult.CloseButtonClicked)) + var result = DrawTypeMetaBlock_Internal(ref rect, elementRootProperty, meta, elementIndex, arrayProperty.arraySize); + if (result.HasFlag(DrawTypeMetaBlockResultFlags.CloseButtonClicked)) { arrayProperty.DeleteArrayElementAtIndex(elementIndex); } - return result != DrawTypeMetaBlockResult.None; + return result != DrawTypeMetaBlockResultFlags.None; } - public static bool DrawTypeMetaBlock(ref Rect position, SerializedProperty rootProperty, ITypeMeta meta, int index = -1, int total = -1) + public static bool DrawTypeMetaBlock(ref Rect rect, SerializedProperty rootProperty, ITypeMeta meta, int index = -1, int total = -1) { - var result = DrawTypeMetaBlock_Internal(ref position, rootProperty, meta, index, total); - if (result.HasFlag(DrawTypeMetaBlockResult.CloseButtonClicked)) + var result = DrawTypeMetaBlock_Internal(ref rect, rootProperty, meta, index, total); + if (result.HasFlag(DrawTypeMetaBlockResultFlags.CloseButtonClicked)) { rootProperty.ResetValues(); } - return result.HasFlag(DrawTypeMetaBlockResult.Drop); + return result.HasFlag(DrawTypeMetaBlockResultFlags.DropExpanded); } - private enum DrawTypeMetaBlockResult + [Flags] + private enum DrawTypeMetaBlockResultFlags { None = 0, - Drop = 1 << 0, + DropExpanded = 1 << 0, CloseButtonClicked = 1 << 1, } - private static DrawTypeMetaBlockResult DrawTypeMetaBlock_Internal(ref Rect position, SerializedProperty rootProperty, ITypeMeta meta, int index = -1, int total = -1) + + + private static DrawTypeMetaBlockResultFlags DrawTypeMetaBlock_Internal(ref Rect rect, SerializedProperty rootProperty, ITypeMeta meta, int index = -1, int total = -1) { - Color alphaPanelColor; if (meta == null) { - alphaPanelColor = Color.black; - alphaPanelColor.a = EscEditorConsts.COMPONENT_DRAWER_ALPHA; - EditorGUI.DrawRect(position, alphaPanelColor); - position = position.AddPadding(DrawTypeMetaBlockPadding * 2f); - return DrawTypeMetaBlockResult.None; + EditorGUI.DrawRect(rect, Color.black.SetAlpha(EscEditorConsts.COMPONENT_DRAWER_ALPHA)); + return DrawTypeMetaBlockResultFlags.None; } - string name = meta.Name; + //string name = meta.Name; string description = meta.Description.Text; - int positionIndex; - if (index < 0) + int positionIndex = index; + if (positionIndex < 0) { positionIndex = int.MaxValue; var counter = rootProperty.Copy(); @@ -765,53 +765,51 @@ namespace DCFApixels.DragonECS.Unity.Editors positionIndex--; } } - else - { - positionIndex = index; - } - alphaPanelColor = SelectPanelColor(meta, positionIndex, total).Desaturate(EscEditorConsts.COMPONENT_DRAWER_DESATURATE).SetAlpha(EscEditorConsts.COMPONENT_DRAWER_ALPHA); + Color panelColor = SelectPanelColor(meta, positionIndex, total) + .Desaturate(EscEditorConsts.COMPONENT_DRAWER_DESATURATE) + .SetAlpha(EscEditorConsts.COMPONENT_DRAWER_ALPHA); - DrawTypeMetaBlockResult result = DrawTypeMetaBlockResult.None; + EditorGUI.DrawRect(rect, panelColor); + + Rect optionRect = rect; + rect = rect.AddPadding(DrawTypeMetaBlockPadding * 2f); + + optionRect.center -= new Vector2(0, optionRect.height); + optionRect.yMin = optionRect.yMax; + optionRect.yMax += HeadIconsRect.height; + optionRect.xMin = optionRect.xMax - 64; + optionRect.center += Vector2.up * DrawTypeMetaBlockPadding; + + DrawTypeMetaBlockResultFlags result = DrawTypeMetaBlockResultFlags.None; using (CheckChanged()) { - EditorGUI.DrawRect(position, alphaPanelColor); - - Rect optionButton = position; - position = position.AddPadding(DrawTypeMetaBlockPadding * 2f); - - optionButton.center -= new Vector2(0, optionButton.height); - optionButton.yMin = optionButton.yMax; - optionButton.yMax += HeadIconsRect.height; - optionButton.xMin = optionButton.xMax - 64; - optionButton.center += Vector2.up * DrawTypeMetaBlockPadding; - //Canceling isExpanded bool oldIsExpanded = rootProperty.isExpanded; - if (ClickTest(optionButton)) + if (ClickTest(optionRect)) { rootProperty.isExpanded = oldIsExpanded; - result |= DrawTypeMetaBlockResult.Drop; + result |= DrawTypeMetaBlockResultFlags.DropExpanded; } //Close button - optionButton.xMin = optionButton.xMax - HeadIconsRect.width; - if (CloseButton(optionButton)) + optionRect.xMin = optionRect.xMax - HeadIconsRect.width; + if (CloseButton(optionRect)) { - result |= DrawTypeMetaBlockResult.CloseButtonClicked; + result |= DrawTypeMetaBlockResultFlags.CloseButtonClicked; return result; } //Edit script button if (ScriptsCache.TryGetScriptAsset(meta.FindRootTypeMeta(), out MonoScript script)) { - optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); - ScriptAssetButton(optionButton, script); + optionRect = HeadIconsRect.MoveTo(optionRect.center - (Vector2.right * optionRect.width)); + ScriptAssetButton(optionRect, script); } //Description icon if (string.IsNullOrEmpty(description) == false) { - optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); - DescriptionIcon(optionButton, description); + optionRect = HeadIconsRect.MoveTo(optionRect.center - (Vector2.right * optionRect.width)); + DescriptionIcon(optionRect, description); } } return result; @@ -890,20 +888,22 @@ namespace DCFApixels.DragonECS.Unity.Editors switch (AutoColorMode) { case ComponentColorMode.Auto: - return color.ToUnityColor().Desaturate(0.48f) / 1.18f; //.Desaturate(0.48f) / 1.18f; + { + return color.ToUnityColor().Desaturate(0.48f) / 1.18f; //.Desaturate(0.48f) / 1.18f; + } case ComponentColorMode.Rainbow: - int localTotal = Mathf.Max(total, EscEditorConsts.AUTO_COLOR_RAINBOW_MIN_RANGE); - Color hsv = Color.HSVToRGB(1f / localTotal * (index % localTotal), 1, 1); - return hsv.Desaturate(0.48f) / 1.18f; + { + int localTotal = Mathf.Max(total, EscEditorConsts.AUTO_COLOR_RAINBOW_MIN_RANGE); + Color hsv = Color.HSVToRGB(1f / localTotal * (index % localTotal), 1, 1); + return hsv.Desaturate(0.48f) / 1.18f; + } default: - return GetGenericPanelColor(index); + { + return index % 2 == 0 ? new Color(0.40f, 0.40f, 0.40f) : new Color(0.54f, 0.54f, 0.54f); + } } } } - public static Color GetGenericPanelColor(int index) - { - return index % 2 == 0 ? new Color(0.40f, 0.40f, 0.40f) : new Color(0.54f, 0.54f, 0.54f); - } #endregion #region Other Elements diff --git a/src/Internal/ReferenceButtonAttributeDrawer.cs b/src/Internal/ReferenceButtonAttributeDrawer.cs index 014ed18..2a3b5de 100644 --- a/src/Internal/ReferenceButtonAttributeDrawer.cs +++ b/src/Internal/ReferenceButtonAttributeDrawer.cs @@ -37,7 +37,6 @@ namespace DCFApixels.DragonECS.Unity.Editors using UnityEditor; using UnityEngine; - [CustomPropertyDrawer(typeof(ComponentTemplateReferenceAttribute), true)] [CustomPropertyDrawer(typeof(ReferenceButtonAttribute), true)] internal sealed class ReferenceButtonAttributeDrawer : ExtendedPropertyDrawer { @@ -68,7 +67,8 @@ namespace DCFApixels.DragonECS.Unity.Editors public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { Init(); - if (property.managedReferenceValue != null && + if (property.propertyType == SerializedPropertyType.ManagedReference && + property.managedReferenceValue != null && Cahce(property).HasSerializableData_Editor) { return EditorGUI.GetPropertyHeight(property, label, true); @@ -81,6 +81,11 @@ namespace DCFApixels.DragonECS.Unity.Editors protected override void DrawCustom(Rect position, SerializedProperty property, GUIContent label) { + if(property.propertyType != SerializedPropertyType.ManagedReference) + { + GUI.Label(position, label); + return; + } if (IsArrayElement) { label = UnityEditorUtility.GetLabelTemp(); diff --git a/src/Templates/EntityTemplate/ComponentTemplateProperty.cs b/src/Templates/EntityTemplate/ComponentTemplateProperty.cs index 998e492..13129a3 100644 --- a/src/Templates/EntityTemplate/ComponentTemplateProperty.cs +++ b/src/Templates/EntityTemplate/ComponentTemplateProperty.cs @@ -77,4 +77,5 @@ namespace DCFApixels.DragonECS IsHideButtonIfNotNull = true; } } + public sealed class ComponentTemplateAttribute : PropertyAttribute { } } \ No newline at end of file diff --git a/src/Templates/EntityTemplate/Editor/ComponentTemplatePropertyDrawer.cs b/src/Templates/EntityTemplate/Editor/ComponentTemplatePropertyDrawer.cs index ff64535..2cecfc6 100644 --- a/src/Templates/EntityTemplate/Editor/ComponentTemplatePropertyDrawer.cs +++ b/src/Templates/EntityTemplate/Editor/ComponentTemplatePropertyDrawer.cs @@ -58,37 +58,40 @@ namespace DCFApixels.DragonECS.Unity.Editors public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { - #region No SerializeReference - if (property.propertyType != SerializedPropertyType.ManagedReference) - { - return EditorGUI.GetPropertyHeight(property, label); - } - #endregion + bool isSerializeReference = property.propertyType == SerializedPropertyType.ManagedReference; + //#region No SerializeReference + //if (property.propertyType != SerializedPropertyType.ManagedReference) + //{ + // return EditorGUI.GetPropertyHeight(property, label); + //} + //#endregion - var instance = property.managedReferenceValue; - IComponentTemplate template = instance as IComponentTemplate; - - if (template == null || instance == null) + if (isSerializeReference) { - return EditorGUIUtility.singleLineHeight + Padding * 2f; - } - - try - { - if (instance is ComponentTemplateBase customTemplate) + var instance = property.managedReferenceValue; + IComponentTemplate template = instance as IComponentTemplate; + if (instance == null) { - property = property.FindPropertyRelative("component"); + return EditorGUIUtility.singleLineHeight + Padding * 2f; + } + + try + { + if (instance is ComponentTemplateBase customTemplate) + { + property = property.FindPropertyRelative("component"); + } + } + catch + { + property = null; + } + if (property == null) + { + return DamagedComponentHeight; } } - catch - { - property = null; - } - if (property == null) - { - return DamagedComponentHeight; - } - + int propCount = EcsGUI.GetChildPropertiesCount(property); return (propCount <= 0 ? EditorGUIUtility.singleLineHeight : EditorGUI.GetPropertyHeight(property, label)) + Padding * 4f; @@ -98,39 +101,47 @@ namespace DCFApixels.DragonECS.Unity.Editors { Draw(position, property, property, label); } - public void Draw(Rect position, SerializedProperty rootProperty, SerializedProperty property, GUIContent label) + public void Draw(Rect rect, SerializedProperty rootProperty, SerializedProperty property, GUIContent label) { - #region No SerializeReference - if (property.propertyType != SerializedPropertyType.ManagedReference) - { - EditorGUI.PropertyField(position, property, label, true); - return; - } - #endregion - - var instance = property.managedReferenceValue; - IComponentTemplate template = instance as IComponentTemplate; - - if (template == null || instance == null) - { - DrawSelectionPopup(position, property, label); - return; - } + bool isSerializeReference = property.propertyType == SerializedPropertyType.ManagedReference; + //#region No SerializeReference + //if (isSerializeReference == false) + //{ + // EditorGUI.PropertyField(position, property, label, true); + // return; + //} + //#endregion + ITypeMeta meta = null; SerializedProperty componentProp = property; - if (componentProp.managedReferenceValue is ComponentTemplateBase customTemplate) + if (isSerializeReference) { - componentProp = property.FindPropertyRelative("component"); + var instance = property.managedReferenceValue; + if (instance == null) + { + DrawSelectionPopup(rect, property, label); + return; + } + + IComponentTemplate template = instance as IComponentTemplate; + if (componentProp.managedReferenceValue is ComponentTemplateBase customTemplate) + { + componentProp = property.FindPropertyRelative("component"); + } + if (componentProp == null) + { + DrawDamagedComponent(rect, "Damaged component template."); + return; + } + + meta = template is ITypeMeta metaOverride ? metaOverride : template.Type.GetMeta(); } - if (componentProp == null) + else { - DrawDamagedComponent(position, "Damaged component template."); - return; + meta = fieldInfo.FieldType.GetMeta(); } - ITypeMeta meta = template is ITypeMeta metaOverride ? metaOverride : template.Type.GetMeta(); - Rect rect = position; if (EcsGUI.DrawTypeMetaBlock(ref rect, rootProperty, meta)) { return; diff --git a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs index 3869699..5c98069 100644 --- a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs +++ b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs @@ -7,7 +7,7 @@ using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors { - internal abstract class EntityTemplateEditorBase : ExtendedEditor + internal abstract class EntityTemplateEditorBase : ExtendedEditor { private ComponentTemplatesDropDown _componentDropDown; diff --git a/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs b/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs index 08cb1d7..63a9fa2 100644 --- a/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs +++ b/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs @@ -2,7 +2,6 @@ #undef DEBUG #endif using DCFApixels.DragonECS.Unity; -using DCFApixels.DragonECS.Unity.Internal; using System; using System.Collections.Generic; using System.Linq; @@ -25,12 +24,12 @@ namespace DCFApixels.DragonECS public class MonoEntityTemplate : MonoEntityTemplateBase, ITemplateNode { [SerializeReference] - [ReferenceButton(true, typeof(IComponentTemplate))] + [ReferenceButton(true, typeof(ITemplateNode))] [FormerlySerializedAs("_components")] - private IComponentTemplate[] _componentTemplates; + private ITemplateNode[] _componentTemplates; #region Methods - public ReadOnlySpan GetComponentTemplates() + public ReadOnlySpan GetComponentTemplates() { return _componentTemplates; } @@ -57,7 +56,7 @@ namespace DCFApixels.DragonECS if (_componentTemplates == null) { return; } foreach (var item in _componentTemplates) { - item?.OnValidate(gameObject); + if(item is IComponentTemplate ct) { ct.OnValidate(gameObject); } } } private void OnDrawGizmos() @@ -65,7 +64,7 @@ namespace DCFApixels.DragonECS if (_componentTemplates == null) { return; } foreach (var item in _componentTemplates) { - item?.OnGizmos(transform, IComponentTemplate.GizmosMode.Always); + if(item is IComponentTemplate ct) { ct.OnGizmos(transform, IComponentTemplate.GizmosMode.Always); } } } private void OnDrawGizmosSelected() @@ -73,7 +72,7 @@ namespace DCFApixels.DragonECS if (_componentTemplates == null) { return; } foreach (var item in _componentTemplates) { - item?.OnGizmos(transform, IComponentTemplate.GizmosMode.Selected); + if(item is IComponentTemplate ct) { ct.OnGizmos(transform, IComponentTemplate.GizmosMode.Selected); } } } #endregion diff --git a/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs b/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs index 675acd1..c4a0ed6 100644 --- a/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs +++ b/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs @@ -2,7 +2,6 @@ #undef DEBUG #endif using DCFApixels.DragonECS.Unity; -using DCFApixels.DragonECS.Unity.Internal; using System; using System.Collections.Generic; using System.Linq; @@ -26,9 +25,9 @@ namespace DCFApixels.DragonECS [SerializeField] private ScriptableEntityTemplateBase[] _templates; [SerializeReference] - [ReferenceButton(true, typeof(IComponentTemplate))] + [ReferenceButton(true, typeof(ITemplateNode))] [FormerlySerializedAs("_components")] - private IComponentTemplate[] _componentTemplates; + private ITemplateNode[] _componentTemplates; #region Methods public ReadOnlySpan GetTemplates() @@ -39,7 +38,7 @@ namespace DCFApixels.DragonECS { _templates = templates.ToArray(); } - public ReadOnlySpan GetComponentTemplates() + public ReadOnlySpan GetComponentTemplates() { return _componentTemplates; } @@ -70,7 +69,7 @@ namespace DCFApixels.DragonECS if (_componentTemplates == null) { return; } foreach (var item in _componentTemplates) { - item?.OnValidate(this); + if (item is IComponentTemplate ct) { ct.OnValidate(this); } } } #endregion