From 7f3c2d05c64b6ec2aaaabf979db1fb5c9a02d49c Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sun, 10 Mar 2024 19:22:47 +0800 Subject: [PATCH] rework IEcsComponentReset to IEcsComponentLifecycle --- src/DataInterfaces.cs | 15 +++++++++------ src/Pools/EcsPool.cs | 30 +++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/DataInterfaces.cs b/src/DataInterfaces.cs index 81a8a70..66f4c12 100644 --- a/src/DataInterfaces.cs +++ b/src/DataInterfaces.cs @@ -36,18 +36,19 @@ namespace DCFApixels.DragonECS #endregion #region IEcsComponentReset - public interface IEcsComponentReset + public interface IEcsComponentLifecycle { - void Reset(ref T component); + void Enable(ref T component); + void Disable(ref T component); } public static class EcsComponentResetHandler { - public static readonly IEcsComponentReset instance; + public static readonly IEcsComponentLifecycle instance; public static readonly bool isHasHandler; static EcsComponentResetHandler() { T def = default; - if (def is IEcsComponentReset intrf) + if (def is IEcsComponentLifecycle intrf) { isHasHandler = true; instance = intrf; @@ -58,10 +59,12 @@ namespace DCFApixels.DragonECS instance = new DummyHandler(); } } - private sealed class DummyHandler : IEcsComponentReset + private sealed class DummyHandler : IEcsComponentLifecycle { [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Reset(ref T component) => component = default; + public void Enable(ref T component) => component = default; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Disable(ref T component) => component = default; } } #endregion diff --git a/src/Pools/EcsPool.cs b/src/Pools/EcsPool.cs index 6996a00..5ec6e00 100644 --- a/src/Pools/EcsPool.cs +++ b/src/Pools/EcsPool.cs @@ -20,8 +20,8 @@ namespace DCFApixels.DragonECS private int[] _recycledItems; private int _recycledItemsCount = 0; - private IEcsComponentReset _componentResetHandler = EcsComponentResetHandler.instance; - private bool _isHasComponentResetHandler = EcsComponentResetHandler.isHasHandler; + private IEcsComponentLifecycle _componentLifecycleHandler = EcsComponentResetHandler.instance; + private bool _isHasComponentLifecycleHandler = EcsComponentResetHandler.isHasHandler; private IEcsComponentCopy _componentCopyHandler = EcsComponentCopyHandler.instance; private bool _isHasComponentCopyHandler = EcsComponentCopyHandler.isHasHandler; @@ -78,7 +78,7 @@ namespace DCFApixels.DragonECS } _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _listeners.InvokeOnAddAndGet(entityID); - ResetComponent(ref _items[itemIndex]); + EnableComponent(ref _items[itemIndex]); return ref _items[itemIndex]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -120,7 +120,7 @@ namespace DCFApixels.DragonECS _listeners.InvokeOnAdd(entityID); } _listeners.InvokeOnGet(entityID); - ResetComponent(ref _items[itemIndex]); + EnableComponent(ref _items[itemIndex]); return ref _items[itemIndex]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -134,7 +134,7 @@ namespace DCFApixels.DragonECS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS if (itemIndex <= 0) { EcsPoolThrowHalper.ThrowNotHaveComponent(entityID); } #endif - ResetComponent(ref _items[itemIndex]); + DisableComponent(ref _items[itemIndex]); if (_recycledItemsCount >= _recycledItems.Length) { Array.Resize(ref _recycledItems, _recycledItems.Length << 1); @@ -217,13 +217,25 @@ namespace DCFApixels.DragonECS } #endregion - #region Reset/Copy + #region Enable/Disable/Copy [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ResetComponent(ref T component) + private void EnableComponent(ref T component) { - if (_isHasComponentResetHandler) + if (_isHasComponentLifecycleHandler) { - _componentResetHandler.Reset(ref component); + _componentLifecycleHandler.Enable(ref component); + } + else + { + component = default; + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void DisableComponent(ref T component) + { + if (_isHasComponentLifecycleHandler) + { + _componentLifecycleHandler.Disable(ref component); } else {