Squashed commit of the following:

commit 2bf43449ed537fcf0edf3720483bdb9fa0f6b4e6
Author: Mikhail <99481254+DCFApixels@users.noreply.github.com>
Date:   Mon Mar 30 16:22:38 2026 +0800

    Fix component draw

commit 4ad2027cc8565cc73270e52ac3760d6e7ae26531
Author: Mikhail <99481254+DCFApixels@users.noreply.github.com>
Date:   Mon Mar 30 14:58:22 2026 +0800

    Update EcsGUI.cs

commit 9ac41ff8ce4512c0e3bfe77a5a2a84266a722228
Author: Mikhail <99481254+DCFApixels@users.noreply.github.com>
Date:   Mon Mar 30 14:55:24 2026 +0800

    stash
This commit is contained in:
Mikhail 2026-03-30 16:22:45 +08:00
parent 20a409049d
commit 35642db710
7 changed files with 135 additions and 120 deletions

View File

@ -714,48 +714,48 @@ namespace DCFApixels.DragonECS.Unity.Editors
{ {
return DrawTypeMetaBlockPadding * 2 + contentHeight; 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); var result = DrawTypeMetaBlock_Internal(ref rect, elementRootProperty, meta, elementIndex, arrayProperty.arraySize);
if (result.HasFlag(DrawTypeMetaBlockResult.CloseButtonClicked)) if (result.HasFlag(DrawTypeMetaBlockResultFlags.CloseButtonClicked))
{ {
arrayProperty.DeleteArrayElementAtIndex(elementIndex); 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); var result = DrawTypeMetaBlock_Internal(ref rect, rootProperty, meta, index, total);
if (result.HasFlag(DrawTypeMetaBlockResult.CloseButtonClicked)) if (result.HasFlag(DrawTypeMetaBlockResultFlags.CloseButtonClicked))
{ {
rootProperty.ResetValues(); rootProperty.ResetValues();
} }
return result.HasFlag(DrawTypeMetaBlockResult.Drop); return result.HasFlag(DrawTypeMetaBlockResultFlags.DropExpanded);
} }
private enum DrawTypeMetaBlockResult [Flags]
private enum DrawTypeMetaBlockResultFlags
{ {
None = 0, None = 0,
Drop = 1 << 0, DropExpanded = 1 << 0,
CloseButtonClicked = 1 << 1, 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) if (meta == null)
{ {
alphaPanelColor = Color.black; EditorGUI.DrawRect(rect, Color.black.SetAlpha(EscEditorConsts.COMPONENT_DRAWER_ALPHA));
alphaPanelColor.a = EscEditorConsts.COMPONENT_DRAWER_ALPHA; return DrawTypeMetaBlockResultFlags.None;
EditorGUI.DrawRect(position, alphaPanelColor);
position = position.AddPadding(DrawTypeMetaBlockPadding * 2f);
return DrawTypeMetaBlockResult.None;
} }
string name = meta.Name; //string name = meta.Name;
string description = meta.Description.Text; string description = meta.Description.Text;
int positionIndex; int positionIndex = index;
if (index < 0) if (positionIndex < 0)
{ {
positionIndex = int.MaxValue; positionIndex = int.MaxValue;
var counter = rootProperty.Copy(); var counter = rootProperty.Copy();
@ -765,53 +765,51 @@ namespace DCFApixels.DragonECS.Unity.Editors
positionIndex--; 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()) 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 //Canceling isExpanded
bool oldIsExpanded = rootProperty.isExpanded; bool oldIsExpanded = rootProperty.isExpanded;
if (ClickTest(optionButton)) if (ClickTest(optionRect))
{ {
rootProperty.isExpanded = oldIsExpanded; rootProperty.isExpanded = oldIsExpanded;
result |= DrawTypeMetaBlockResult.Drop; result |= DrawTypeMetaBlockResultFlags.DropExpanded;
} }
//Close button //Close button
optionButton.xMin = optionButton.xMax - HeadIconsRect.width; optionRect.xMin = optionRect.xMax - HeadIconsRect.width;
if (CloseButton(optionButton)) if (CloseButton(optionRect))
{ {
result |= DrawTypeMetaBlockResult.CloseButtonClicked; result |= DrawTypeMetaBlockResultFlags.CloseButtonClicked;
return result; return result;
} }
//Edit script button //Edit script button
if (ScriptsCache.TryGetScriptAsset(meta.FindRootTypeMeta(), out MonoScript script)) if (ScriptsCache.TryGetScriptAsset(meta.FindRootTypeMeta(), out MonoScript script))
{ {
optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); optionRect = HeadIconsRect.MoveTo(optionRect.center - (Vector2.right * optionRect.width));
ScriptAssetButton(optionButton, script); ScriptAssetButton(optionRect, script);
} }
//Description icon //Description icon
if (string.IsNullOrEmpty(description) == false) if (string.IsNullOrEmpty(description) == false)
{ {
optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); optionRect = HeadIconsRect.MoveTo(optionRect.center - (Vector2.right * optionRect.width));
DescriptionIcon(optionButton, description); DescriptionIcon(optionRect, description);
} }
} }
return result; return result;
@ -890,20 +888,22 @@ namespace DCFApixels.DragonECS.Unity.Editors
switch (AutoColorMode) switch (AutoColorMode)
{ {
case ComponentColorMode.Auto: 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: case ComponentColorMode.Rainbow:
{
int localTotal = Mathf.Max(total, EscEditorConsts.AUTO_COLOR_RAINBOW_MIN_RANGE); int localTotal = Mathf.Max(total, EscEditorConsts.AUTO_COLOR_RAINBOW_MIN_RANGE);
Color hsv = Color.HSVToRGB(1f / localTotal * (index % localTotal), 1, 1); Color hsv = Color.HSVToRGB(1f / localTotal * (index % localTotal), 1, 1);
return hsv.Desaturate(0.48f) / 1.18f; return hsv.Desaturate(0.48f) / 1.18f;
}
default: default:
return GetGenericPanelColor(index);
}
}
}
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); return index % 2 == 0 ? new Color(0.40f, 0.40f, 0.40f) : new Color(0.54f, 0.54f, 0.54f);
} }
}
}
}
#endregion #endregion
#region Other Elements #region Other Elements

View File

@ -37,7 +37,6 @@ namespace DCFApixels.DragonECS.Unity.Editors
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
[CustomPropertyDrawer(typeof(ComponentTemplateReferenceAttribute), true)]
[CustomPropertyDrawer(typeof(ReferenceButtonAttribute), true)] [CustomPropertyDrawer(typeof(ReferenceButtonAttribute), true)]
internal sealed class ReferenceButtonAttributeDrawer : ExtendedPropertyDrawer<IReferenceButtonAttribute> internal sealed class ReferenceButtonAttributeDrawer : ExtendedPropertyDrawer<IReferenceButtonAttribute>
{ {
@ -68,7 +67,8 @@ namespace DCFApixels.DragonECS.Unity.Editors
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{ {
Init(); Init();
if (property.managedReferenceValue != null && if (property.propertyType == SerializedPropertyType.ManagedReference &&
property.managedReferenceValue != null &&
Cahce(property).HasSerializableData_Editor) Cahce(property).HasSerializableData_Editor)
{ {
return EditorGUI.GetPropertyHeight(property, label, true); 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) protected override void DrawCustom(Rect position, SerializedProperty property, GUIContent label)
{ {
if(property.propertyType != SerializedPropertyType.ManagedReference)
{
GUI.Label(position, label);
return;
}
if (IsArrayElement) if (IsArrayElement)
{ {
label = UnityEditorUtility.GetLabelTemp(); label = UnityEditorUtility.GetLabelTemp();

View File

@ -77,4 +77,5 @@ namespace DCFApixels.DragonECS
IsHideButtonIfNotNull = true; IsHideButtonIfNotNull = true;
} }
} }
public sealed class ComponentTemplateAttribute : PropertyAttribute { }
} }

View File

@ -58,17 +58,19 @@ namespace DCFApixels.DragonECS.Unity.Editors
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{ {
#region No SerializeReference bool isSerializeReference = property.propertyType == SerializedPropertyType.ManagedReference;
if (property.propertyType != SerializedPropertyType.ManagedReference) //#region No SerializeReference
{ //if (property.propertyType != SerializedPropertyType.ManagedReference)
return EditorGUI.GetPropertyHeight(property, label); //{
} // return EditorGUI.GetPropertyHeight(property, label);
#endregion //}
//#endregion
if (isSerializeReference)
{
var instance = property.managedReferenceValue; var instance = property.managedReferenceValue;
IComponentTemplate template = instance as IComponentTemplate; IComponentTemplate template = instance as IComponentTemplate;
if (instance == null)
if (template == null || instance == null)
{ {
return EditorGUIUtility.singleLineHeight + Padding * 2f; return EditorGUIUtility.singleLineHeight + Padding * 2f;
} }
@ -88,6 +90,7 @@ namespace DCFApixels.DragonECS.Unity.Editors
{ {
return DamagedComponentHeight; return DamagedComponentHeight;
} }
}
int propCount = EcsGUI.GetChildPropertiesCount(property); int propCount = EcsGUI.GetChildPropertiesCount(property);
@ -98,39 +101,47 @@ namespace DCFApixels.DragonECS.Unity.Editors
{ {
Draw(position, property, property, label); 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 bool isSerializeReference = property.propertyType == SerializedPropertyType.ManagedReference;
if (property.propertyType != SerializedPropertyType.ManagedReference) //#region No SerializeReference
{ //if (isSerializeReference == false)
EditorGUI.PropertyField(position, property, label, true); //{
return; // EditorGUI.PropertyField(position, property, label, true);
} // return;
#endregion //}
//#endregion
var instance = property.managedReferenceValue;
IComponentTemplate template = instance as IComponentTemplate;
if (template == null || instance == null)
{
DrawSelectionPopup(position, property, label);
return;
}
ITypeMeta meta = null;
SerializedProperty componentProp = property; SerializedProperty componentProp = property;
if (isSerializeReference)
{
var instance = property.managedReferenceValue;
if (instance == null)
{
DrawSelectionPopup(rect, property, label);
return;
}
IComponentTemplate template = instance as IComponentTemplate;
if (componentProp.managedReferenceValue is ComponentTemplateBase customTemplate) if (componentProp.managedReferenceValue is ComponentTemplateBase customTemplate)
{ {
componentProp = property.FindPropertyRelative("component"); componentProp = property.FindPropertyRelative("component");
} }
if (componentProp == null) if (componentProp == null)
{ {
DrawDamagedComponent(position, "Damaged component template."); DrawDamagedComponent(rect, "Damaged component template.");
return; return;
} }
ITypeMeta meta = template is ITypeMeta metaOverride ? metaOverride : template.Type.GetMeta(); meta = template is ITypeMeta metaOverride ? metaOverride : template.Type.GetMeta();
}
else
{
meta = fieldInfo.FieldType.GetMeta();
}
Rect rect = position;
if (EcsGUI.DrawTypeMetaBlock(ref rect, rootProperty, meta)) if (EcsGUI.DrawTypeMetaBlock(ref rect, rootProperty, meta))
{ {
return; return;

View File

@ -7,7 +7,7 @@ using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors namespace DCFApixels.DragonECS.Unity.Editors
{ {
internal abstract class EntityTemplateEditorBase : ExtendedEditor<ITemplateNode> internal abstract class EntityTemplateEditorBase : ExtendedEditor
{ {
private ComponentTemplatesDropDown _componentDropDown; private ComponentTemplatesDropDown _componentDropDown;

View File

@ -2,7 +2,6 @@
#undef DEBUG #undef DEBUG
#endif #endif
using DCFApixels.DragonECS.Unity; using DCFApixels.DragonECS.Unity;
using DCFApixels.DragonECS.Unity.Internal;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -25,12 +24,12 @@ namespace DCFApixels.DragonECS
public class MonoEntityTemplate : MonoEntityTemplateBase, ITemplateNode public class MonoEntityTemplate : MonoEntityTemplateBase, ITemplateNode
{ {
[SerializeReference] [SerializeReference]
[ReferenceButton(true, typeof(IComponentTemplate))] [ReferenceButton(true, typeof(ITemplateNode))]
[FormerlySerializedAs("_components")] [FormerlySerializedAs("_components")]
private IComponentTemplate[] _componentTemplates; private ITemplateNode[] _componentTemplates;
#region Methods #region Methods
public ReadOnlySpan<IComponentTemplate> GetComponentTemplates() public ReadOnlySpan<ITemplateNode> GetComponentTemplates()
{ {
return _componentTemplates; return _componentTemplates;
} }
@ -57,7 +56,7 @@ namespace DCFApixels.DragonECS
if (_componentTemplates == null) { return; } if (_componentTemplates == null) { return; }
foreach (var item in _componentTemplates) foreach (var item in _componentTemplates)
{ {
item?.OnValidate(gameObject); if(item is IComponentTemplate ct) { ct.OnValidate(gameObject); }
} }
} }
private void OnDrawGizmos() private void OnDrawGizmos()
@ -65,7 +64,7 @@ namespace DCFApixels.DragonECS
if (_componentTemplates == null) { return; } if (_componentTemplates == null) { return; }
foreach (var item in _componentTemplates) 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() private void OnDrawGizmosSelected()
@ -73,7 +72,7 @@ namespace DCFApixels.DragonECS
if (_componentTemplates == null) { return; } if (_componentTemplates == null) { return; }
foreach (var item in _componentTemplates) foreach (var item in _componentTemplates)
{ {
item?.OnGizmos(transform, IComponentTemplate.GizmosMode.Selected); if(item is IComponentTemplate ct) { ct.OnGizmos(transform, IComponentTemplate.GizmosMode.Selected); }
} }
} }
#endregion #endregion

View File

@ -2,7 +2,6 @@
#undef DEBUG #undef DEBUG
#endif #endif
using DCFApixels.DragonECS.Unity; using DCFApixels.DragonECS.Unity;
using DCFApixels.DragonECS.Unity.Internal;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -26,9 +25,9 @@ namespace DCFApixels.DragonECS
[SerializeField] [SerializeField]
private ScriptableEntityTemplateBase[] _templates; private ScriptableEntityTemplateBase[] _templates;
[SerializeReference] [SerializeReference]
[ReferenceButton(true, typeof(IComponentTemplate))] [ReferenceButton(true, typeof(ITemplateNode))]
[FormerlySerializedAs("_components")] [FormerlySerializedAs("_components")]
private IComponentTemplate[] _componentTemplates; private ITemplateNode[] _componentTemplates;
#region Methods #region Methods
public ReadOnlySpan<ScriptableEntityTemplateBase> GetTemplates() public ReadOnlySpan<ScriptableEntityTemplateBase> GetTemplates()
@ -39,7 +38,7 @@ namespace DCFApixels.DragonECS
{ {
_templates = templates.ToArray(); _templates = templates.ToArray();
} }
public ReadOnlySpan<IComponentTemplate> GetComponentTemplates() public ReadOnlySpan<ITemplateNode> GetComponentTemplates()
{ {
return _componentTemplates; return _componentTemplates;
} }
@ -70,7 +69,7 @@ namespace DCFApixels.DragonECS
if (_componentTemplates == null) { return; } if (_componentTemplates == null) { return; }
foreach (var item in _componentTemplates) foreach (var item in _componentTemplates)
{ {
item?.OnValidate(this); if (item is IComponentTemplate ct) { ct.OnValidate(this); }
} }
} }
#endregion #endregion