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;
}
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

View File

@ -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<IReferenceButtonAttribute>
{
@ -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();

View File

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

View File

@ -58,35 +58,38 @@ 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);
@ -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;

View File

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

View File

@ -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<IComponentTemplate> GetComponentTemplates()
public ReadOnlySpan<ITemplateNode> 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

View File

@ -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<ScriptableEntityTemplateBase> GetTemplates()
@ -39,7 +38,7 @@ namespace DCFApixels.DragonECS
{
_templates = templates.ToArray();
}
public ReadOnlySpan<IComponentTemplate> GetComponentTemplates()
public ReadOnlySpan<ITemplateNode> 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