rework IEcsComponentReset to IEcsComponentLifecycle

This commit is contained in:
Mikhail 2024-03-10 19:22:47 +08:00
parent 353dd1eb81
commit 7f3c2d05c6
2 changed files with 30 additions and 15 deletions

View File

@ -36,18 +36,19 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region IEcsComponentReset #region IEcsComponentReset
public interface IEcsComponentReset<T> public interface IEcsComponentLifecycle<T>
{ {
void Reset(ref T component); void Enable(ref T component);
void Disable(ref T component);
} }
public static class EcsComponentResetHandler<T> public static class EcsComponentResetHandler<T>
{ {
public static readonly IEcsComponentReset<T> instance; public static readonly IEcsComponentLifecycle<T> instance;
public static readonly bool isHasHandler; public static readonly bool isHasHandler;
static EcsComponentResetHandler() static EcsComponentResetHandler()
{ {
T def = default; T def = default;
if (def is IEcsComponentReset<T> intrf) if (def is IEcsComponentLifecycle<T> intrf)
{ {
isHasHandler = true; isHasHandler = true;
instance = intrf; instance = intrf;
@ -58,10 +59,12 @@ namespace DCFApixels.DragonECS
instance = new DummyHandler(); instance = new DummyHandler();
} }
} }
private sealed class DummyHandler : IEcsComponentReset<T> private sealed class DummyHandler : IEcsComponentLifecycle<T>
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [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 #endregion

View File

@ -20,8 +20,8 @@ namespace DCFApixels.DragonECS
private int[] _recycledItems; private int[] _recycledItems;
private int _recycledItemsCount = 0; private int _recycledItemsCount = 0;
private IEcsComponentReset<T> _componentResetHandler = EcsComponentResetHandler<T>.instance; private IEcsComponentLifecycle<T> _componentLifecycleHandler = EcsComponentResetHandler<T>.instance;
private bool _isHasComponentResetHandler = EcsComponentResetHandler<T>.isHasHandler; private bool _isHasComponentLifecycleHandler = EcsComponentResetHandler<T>.isHasHandler;
private IEcsComponentCopy<T> _componentCopyHandler = EcsComponentCopyHandler<T>.instance; private IEcsComponentCopy<T> _componentCopyHandler = EcsComponentCopyHandler<T>.instance;
private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.isHasHandler; private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.isHasHandler;
@ -78,7 +78,7 @@ namespace DCFApixels.DragonECS
} }
_mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit);
_listeners.InvokeOnAddAndGet(entityID); _listeners.InvokeOnAddAndGet(entityID);
ResetComponent(ref _items[itemIndex]); EnableComponent(ref _items[itemIndex]);
return ref _items[itemIndex]; return ref _items[itemIndex];
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -120,7 +120,7 @@ namespace DCFApixels.DragonECS
_listeners.InvokeOnAdd(entityID); _listeners.InvokeOnAdd(entityID);
} }
_listeners.InvokeOnGet(entityID); _listeners.InvokeOnGet(entityID);
ResetComponent(ref _items[itemIndex]); EnableComponent(ref _items[itemIndex]);
return ref _items[itemIndex]; return ref _items[itemIndex];
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -134,7 +134,7 @@ namespace DCFApixels.DragonECS
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
if (itemIndex <= 0) { EcsPoolThrowHalper.ThrowNotHaveComponent<T>(entityID); } if (itemIndex <= 0) { EcsPoolThrowHalper.ThrowNotHaveComponent<T>(entityID); }
#endif #endif
ResetComponent(ref _items[itemIndex]); DisableComponent(ref _items[itemIndex]);
if (_recycledItemsCount >= _recycledItems.Length) if (_recycledItemsCount >= _recycledItems.Length)
{ {
Array.Resize(ref _recycledItems, _recycledItems.Length << 1); Array.Resize(ref _recycledItems, _recycledItems.Length << 1);
@ -217,13 +217,25 @@ namespace DCFApixels.DragonECS
} }
#endregion #endregion
#region Reset/Copy #region Enable/Disable/Copy
[MethodImpl(MethodImplOptions.AggressiveInlining)] [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 else
{ {