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
#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 readonly IEcsComponentReset<T> instance;
public static readonly IEcsComponentLifecycle<T> instance;
public static readonly bool isHasHandler;
static EcsComponentResetHandler()
{
T def = default;
if (def is IEcsComponentReset<T> intrf)
if (def is IEcsComponentLifecycle<T> intrf)
{
isHasHandler = true;
instance = intrf;
@ -58,10 +59,12 @@ namespace DCFApixels.DragonECS
instance = new DummyHandler();
}
}
private sealed class DummyHandler : IEcsComponentReset<T>
private sealed class DummyHandler : IEcsComponentLifecycle<T>
{
[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

View File

@ -20,8 +20,8 @@ namespace DCFApixels.DragonECS
private int[] _recycledItems;
private int _recycledItemsCount = 0;
private IEcsComponentReset<T> _componentResetHandler = EcsComponentResetHandler<T>.instance;
private bool _isHasComponentResetHandler = EcsComponentResetHandler<T>.isHasHandler;
private IEcsComponentLifecycle<T> _componentLifecycleHandler = EcsComponentResetHandler<T>.instance;
private bool _isHasComponentLifecycleHandler = EcsComponentResetHandler<T>.isHasHandler;
private IEcsComponentCopy<T> _componentCopyHandler = EcsComponentCopyHandler<T>.instance;
private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.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<T>(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
{