From 9bae371c25035dde30e9cb436c50314f1a44b02b Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 24 Mar 2025 13:51:02 +0800 Subject: [PATCH] impl IClonable for ComponentTemplateBase --- .../Templates/ComponentTemplateBase.cs | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Templates/EntityTemplate/Templates/ComponentTemplateBase.cs b/src/Templates/EntityTemplate/Templates/ComponentTemplateBase.cs index 252828e..8d719a4 100644 --- a/src/Templates/EntityTemplate/Templates/ComponentTemplateBase.cs +++ b/src/Templates/EntityTemplate/Templates/ComponentTemplateBase.cs @@ -58,7 +58,7 @@ namespace DCFApixels.DragonECS } [Serializable] [StructLayout(LayoutKind.Sequential)] - public abstract class ComponentTemplateBase : ComponentTemplateBase + public abstract class ComponentTemplateBase : ComponentTemplateBase, ICloneable { protected static readonly TypeMeta Meta = EcsDebugUtility.GetTypeMeta(); protected static readonly bool _isHasIEcsComponentLifecycle; @@ -96,19 +96,9 @@ namespace DCFApixels.DragonECS _isHasIEcsComponentLifecycle = EcsComponentLifecycleHandler.isHasHandler; _iEcsComponentLifecycle = EcsComponentLifecycleHandler.instance; } - private static T InitComponent() - { - T result = default; - if (_isHasIEcsComponentLifecycle) - { - _iEcsComponentLifecycle.Enable(ref result); - } - result = DefaultValueType; - return result; - } [SerializeField] - protected T component = InitComponent(); + protected T component = DefaultValueType; [SerializeField] [HideInInspector] private byte _offset; // Avoids the error "Cannot get managed reference index with out bounds offset" @@ -126,6 +116,13 @@ namespace DCFApixels.DragonECS #region Methods public sealed override object GetRaw() { return component; } public sealed override void SetRaw(object raw) { component = (T)raw; } + protected virtual T CloneComponent() { return component; } + object ICloneable.Clone() + { + ComponentTemplateBase templateClone = (ComponentTemplateBase)MemberwiseClone(); + templateClone.component = CloneComponent(); + return templateClone; + } #endregion } @@ -154,6 +151,10 @@ namespace DCFApixels.DragonECS.Unity.Internal private static MethodInfo memberwiseCloneMethdo = typeof(object).GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic); internal static IComponentTemplate Clone(this IComponentTemplate obj) { + if(obj is ICloneable cloneable) + { + return (IComponentTemplate)cloneable.Clone(); + } return (IComponentTemplate)memberwiseCloneMethdo.Invoke(obj, null); } }