mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-11-14 01:35:54 +08:00
rework IEcsComponentReset to IEcsComponentLifecycle
This commit is contained in:
parent
353dd1eb81
commit
7f3c2d05c6
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user