From b1ec48226611dd195918e3d902701314007a4657 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:19:35 +0800 Subject: [PATCH] add IsUnique property to IComponentTemplate --- .../Editor/EntityTemplateEditor.cs | 12 ++++++--- src/EntityTemplate/ITemplateNode.cs | 25 ++----------------- .../Templates/ComponentTemplateBase.cs | 2 ++ .../Templates/MonoEntityTemplate.cs | 6 ----- .../Templates/ScriptableEntityTemplate.cs | 6 ----- 5 files changed, 12 insertions(+), 39 deletions(-) diff --git a/src/EntityTemplate/Editor/EntityTemplateEditor.cs b/src/EntityTemplate/Editor/EntityTemplateEditor.cs index 537bb96..661ac20 100644 --- a/src/EntityTemplate/Editor/EntityTemplateEditor.cs +++ b/src/EntityTemplate/Editor/EntityTemplateEditor.cs @@ -57,20 +57,24 @@ namespace DCFApixels.DragonECS.Unity.Editors private void OnAddComponent(object obj) { Type componentType = obj.GetType(); + IComponentTemplate cmptmp = (IComponentTemplate)obj; if (this.target is ITemplateInternal target) { SerializedProperty componentsProp = serializedObject.FindProperty(target.ComponentsPropertyName); - for (int i = 0; i < componentsProp.arraySize; i++) + if (cmptmp.IsUnique) { - if (componentsProp.GetArrayElementAtIndex(i).managedReferenceValue.GetType() == componentType) + for (int i = 0, iMax = componentsProp.arraySize; i < iMax; i++) { - return; + if (componentsProp.GetArrayElementAtIndex(i).managedReferenceValue.GetType() == componentType) + { + return; + } } } int index = componentsProp.arraySize; componentsProp.InsertArrayElementAtIndex(index); - componentsProp.GetArrayElementAtIndex(index).managedReferenceValue = ((IComponentTemplate)obj).Clone(); + componentsProp.GetArrayElementAtIndex(index).managedReferenceValue = cmptmp.Clone(); serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(this.target); diff --git a/src/EntityTemplate/ITemplateNode.cs b/src/EntityTemplate/ITemplateNode.cs index 771cd69..582b91d 100644 --- a/src/EntityTemplate/ITemplateNode.cs +++ b/src/EntityTemplate/ITemplateNode.cs @@ -1,10 +1,7 @@ namespace DCFApixels.DragonECS { - public interface ITemplate : ITemplateNode - { - //void Add(ITemplateNode template); - //void Remove(ITemplateNode template); - } + public interface ITemplate : ITemplateNode { } + public static class ITemplateNodeExtensions { public static entlong NewEntityWithGameObject(this EcsWorld world, ITemplateNode template, string name = "Entity", GameObjectIcon icon = GameObjectIcon.NONE) @@ -14,23 +11,6 @@ return e; } } - - //[Serializable] - //public class EntityTemplateInheritanceMatrix - //{ - // [SerializeReference] - // private ITemplateNode[] _components; - // - // #region Methods - // public void Apply(int worldID, int entityID) - // { - // foreach (var item in _components) - // { - // item.Apply(worldID, entityID); - // } - // } - // #endregion - //} } namespace DCFApixels.DragonECS.Unity.Internal @@ -38,6 +18,5 @@ namespace DCFApixels.DragonECS.Unity.Internal internal interface ITemplateInternal : ITemplate { string ComponentsPropertyName { get; } - //EntityTemplateInheritanceMatrix InheritanceMatrix { get; } } } \ No newline at end of file diff --git a/src/EntityTemplate/Templates/ComponentTemplateBase.cs b/src/EntityTemplate/Templates/ComponentTemplateBase.cs index 8d7ec95..4b03d40 100644 --- a/src/EntityTemplate/Templates/ComponentTemplateBase.cs +++ b/src/EntityTemplate/Templates/ComponentTemplateBase.cs @@ -12,6 +12,7 @@ namespace DCFApixels.DragonECS { #region Properties Type Type { get; } + bool IsUnique { get; } #endregion #region Methods @@ -39,6 +40,7 @@ namespace DCFApixels.DragonECS public virtual MetaGroup Group { get { return MetaGroup.Empty; } } public virtual MetaDescription Description { get { return MetaDescription.Empty; } } public virtual IReadOnlyList Tags { get { return Array.Empty(); } } + public virtual bool IsUnique { get { return true; } } #endregion #region Methods diff --git a/src/EntityTemplate/Templates/MonoEntityTemplate.cs b/src/EntityTemplate/Templates/MonoEntityTemplate.cs index 276ec44..e040a31 100644 --- a/src/EntityTemplate/Templates/MonoEntityTemplate.cs +++ b/src/EntityTemplate/Templates/MonoEntityTemplate.cs @@ -19,18 +19,12 @@ namespace DCFApixels.DragonECS { [SerializeReference] private IComponentTemplate[] _components; - //[SerializeField] - //private EntityTemplateInheritanceMatrix _inheritanceMatrix; #region Properties string ITemplateInternal.ComponentsPropertyName { get { return nameof(_components); } } - //EntityTemplateInheritanceMatrix ITemplateInternal.InheritanceMatrix - //{ - // get { return _inheritanceMatrix; } - //} #endregion #region Methods diff --git a/src/EntityTemplate/Templates/ScriptableEntityTemplate.cs b/src/EntityTemplate/Templates/ScriptableEntityTemplate.cs index 45e81dc..195816b 100644 --- a/src/EntityTemplate/Templates/ScriptableEntityTemplate.cs +++ b/src/EntityTemplate/Templates/ScriptableEntityTemplate.cs @@ -18,18 +18,12 @@ namespace DCFApixels.DragonECS { [SerializeReference] private IComponentTemplate[] _components; - //[SerializeField] - //private EntityTemplateInheritanceMatrix _inheritanceMatrix; #region Properties string ITemplateInternal.ComponentsPropertyName { get { return nameof(_components); } } - //EntityTemplateInheritanceMatrix ITemplateInternal.InheritanceMatrix - //{ - // get { return _inheritanceMatrix; } - //} #endregion #region Methods