Update EcsEntityConnect.cs

This commit is contained in:
Mikhail 2026-03-02 17:13:11 +08:00
parent 9aa4d21e79
commit 51735b9ce0

View File

@ -19,44 +19,47 @@ namespace DCFApixels.DragonECS
public static class EcsConnect public static class EcsConnect
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Connect(this Component cmp, entlong entity, bool applyTemplates) public static EcsEntityConnect Connect(this Component cmp, entlong entity, bool applyTemplates)
{ {
Connect(entity, cmp, applyTemplates); return Connect(entity, cmp, applyTemplates);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Connect(this entlong entity, Component cmp, bool applyTemplates) public static EcsEntityConnect Connect(this entlong entity, Component cmp, bool applyTemplates)
{ {
if (cmp.TryGetComponent(out EcsEntityConnect connect) == false) if (cmp.TryGetComponent(out EcsEntityConnect connect) == false)
{ {
connect = cmp.gameObject.AddComponent<EcsEntityConnect>(); connect = cmp.gameObject.AddComponent<EcsEntityConnect>();
} }
connect.ConnectWith(entity, applyTemplates); connect.ConnectWith(entity, applyTemplates);
return connect;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Connect(this GameObject go, entlong entity, bool applyTemplates) public static EcsEntityConnect Connect(this GameObject go, entlong entity, bool applyTemplates)
{ {
Connect(entity, go, applyTemplates); return Connect(entity, go, applyTemplates);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Connect(this entlong entity, GameObject go, bool applyTemplates) public static EcsEntityConnect Connect(this entlong entity, GameObject go, bool applyTemplates)
{ {
if (go.TryGetComponent(out EcsEntityConnect connect) == false) if (go.TryGetComponent(out EcsEntityConnect connect) == false)
{ {
connect = go.AddComponent<EcsEntityConnect>(); connect = go.AddComponent<EcsEntityConnect>();
} }
connect.ConnectWith(entity, applyTemplates); connect.ConnectWith(entity, applyTemplates);
return connect;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Connect(this EcsEntityConnect connect, entlong entity, bool applyTemplates) public static EcsEntityConnect Connect(this EcsEntityConnect connect, entlong entity, bool applyTemplates)
{ {
Connect(entity, connect, applyTemplates); return Connect(entity, connect, applyTemplates);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Connect(this entlong entity, EcsEntityConnect connect, bool applyTemplates) public static EcsEntityConnect Connect(this entlong entity, EcsEntityConnect connect, bool applyTemplates)
{ {
connect.ConnectWith(entity, applyTemplates); connect.ConnectWith(entity, applyTemplates);
return connect;
} }
} }
@ -77,9 +80,9 @@ namespace DCFApixels.DragonECS
[SerializeField] [SerializeField]
private bool _deleteEntityWithDestroy = false; private bool _deleteEntityWithDestroy = false;
[SerializeField] [SerializeField]
private ScriptableEntityTemplateBase[] _scriptableTemplates; private ScriptableEntityTemplateBase[] _scriptableTemplates = System.Array.Empty<ScriptableEntityTemplateBase>();
[SerializeField] [SerializeField]
private MonoEntityTemplateBase[] _monoTemplates; private MonoEntityTemplateBase[] _monoTemplates = System.Array.Empty<MonoEntityTemplateBase>();
private bool _isConnectInvoked = false; private bool _isConnectInvoked = false;
@ -226,12 +229,12 @@ namespace DCFApixels.DragonECS
#region Editor #region Editor
#if UNITY_EDITOR #if UNITY_EDITOR
[ContextMenu("Autoset")] [ContextMenu("Autoset")]
internal void Autoset_Editor() public void Autoset_Editor()
{ {
Autoset(this); Autoset(this);
} }
[ContextMenu("Autoset Cascade")] [ContextMenu("Autoset Cascade")]
internal void AutosetCascade_Editor() public void AutosetCascade_Editor()
{ {
foreach (var item in GetComponentsInChildren<EcsEntityConnect>()) foreach (var item in GetComponentsInChildren<EcsEntityConnect>())
{ {
@ -258,27 +261,34 @@ namespace DCFApixels.DragonECS
IEnumerable<MonoEntityTemplateBase> result; IEnumerable<MonoEntityTemplateBase> result;
if (target.MonoTemplates != null && target.MonoTemplates.Count() > 0) if (target.MonoTemplates != null && target.MonoTemplates.Count() > 0)
{ {
result = target.MonoTemplates.Where(o => o != null).Union(GetTemplatesFor(target.transform)); result = target.MonoTemplates.Where(o => o != null).Union(GetTemplatesFor(target.transform).Range);
} }
else else
{ {
result = GetTemplatesFor(target.transform); result = GetTemplatesFor(target.transform).Range;
} }
target._monoTemplates = result.ToArray(); target._monoTemplates = result.ToArray();
EditorUtility.SetDirty(target); EditorUtility.SetDirty(target);
} }
private static IEnumerable<MonoEntityTemplateBase> GetTemplatesFor(Transform parent) private static (int Count, IEnumerable<MonoEntityTemplateBase> Range) GetTemplatesFor(Transform parent)
{ {
IEnumerable<MonoEntityTemplateBase> result = parent.GetComponents<MonoEntityTemplateBase>(); (int Count, IEnumerable<MonoEntityTemplateBase> Range) result;
result.Count = 0;
result.Range = parent.GetComponents<MonoEntityTemplateBase>();
for (int i = 0; i < parent.childCount; i++) for (int i = 0; i < parent.childCount; i++)
{ {
var child = parent.GetChild(i); var child = parent.GetChild(i);
if (child.TryGetComponent<EcsEntityConnect>(out _)) if (child.TryGetComponent<EcsEntityConnect>(out _) == false)
{ {
return Enumerable.Empty<MonoEntityTemplateBase>(); var concated = GetTemplatesFor(child);
if (concated.Count > 0)
{
result.Range = result.Range.Concat(concated.Range);
result.Count += concated.Count;
}
} }
result = result.Concat(GetTemplatesFor(child));
} }
return result; return result;
} }