mirror of
https://github.com/DCFApixels/DragonECS-Unity.git
synced 2026-04-22 04:35:55 +08:00
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:
parent
20a409049d
commit
35642db710
@ -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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Other Elements
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -77,4 +77,5 @@ namespace DCFApixels.DragonECS
|
||||
IsHideButtonIfNotNull = true;
|
||||
}
|
||||
}
|
||||
public sealed class ComponentTemplateAttribute : PropertyAttribute { }
|
||||
}
|
||||
@ -58,17 +58,19 @@ 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
|
||||
|
||||
if (isSerializeReference)
|
||||
{
|
||||
var instance = property.managedReferenceValue;
|
||||
IComponentTemplate template = instance as IComponentTemplate;
|
||||
|
||||
if (template == null || instance == null)
|
||||
if (instance == null)
|
||||
{
|
||||
return EditorGUIUtility.singleLineHeight + Padding * 2f;
|
||||
}
|
||||
@ -88,6 +90,7 @@ namespace DCFApixels.DragonECS.Unity.Editors
|
||||
{
|
||||
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 (isSerializeReference)
|
||||
{
|
||||
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(position, "Damaged component template.");
|
||||
DrawDamagedComponent(rect, "Damaged component template.");
|
||||
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))
|
||||
{
|
||||
return;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user