diff --git a/Src/Core/ECS/Entity.cs b/Src/Core/ECS/Entity.cs index 748fbce..4a68590 100644 --- a/Src/Core/ECS/Entity.cs +++ b/Src/Core/ECS/Entity.cs @@ -8,22 +8,6 @@ namespace BITKit.Entities { public class Entity : IEntity, IDisposable { - private class EntityServiceProvider : IServiceProvider - { - public ServiceProvider ServiceProvider; - public readonly List Services = new(); - public object GetService(Type serviceType) - { - var value = ServiceProvider.GetService(serviceType); - if (value != null) - { - Services.TryAdd(value); - } - - return value; - } - } - public Entity() { ServiceCollection.AddSingleton(this); @@ -36,26 +20,12 @@ namespace BITKit.Entities public CancellationToken CancellationToken => _cancellationTokenSource.Token; private readonly CancellationTokenSource _cancellationTokenSource = new(); - public IServiceProvider ServiceProvider - { - get - { - if (_serviceProvider is not null) - { - return _serviceProvider; - } - - var value = new EntityServiceProvider() - { - ServiceProvider = ServiceCollection.BuildServiceProvider() - }; - _serviceProvider = value; - return _serviceProvider; - } - } + public IServiceProvider ServiceProvider => _serviceProvider ??= ServiceCollection.BuildServiceProvider(); + private ServiceProvider _serviceProvider; public IServiceCollection ServiceCollection { get; } = new ServiceCollection(); - private EntityServiceProvider _serviceProvider; - public object[] GetServices()=> _serviceProvider.Services.ToArray(); + + public object[] GetServices() => ServiceCollection.ToArray() + .Select(x => _serviceProvider.GetService(x.ServiceType)).ToArray(); public void Inject(object obj) { foreach (var fieldInfo in obj.GetType().GetFields(ReflectionHelper.Flags)) @@ -70,11 +40,7 @@ namespace BITKit.Entities public void Dispose() { _cancellationTokenSource.Cancel(); - _serviceProvider.ServiceProvider.Dispose(); - foreach (var x in GetServices().OfType()) - { - x.Dispose(); - } + _serviceProvider.Dispose(); } } } \ No newline at end of file diff --git a/Src/Core/StateMachine/AsyncStateMachine.cs b/Src/Core/StateMachine/AsyncStateMachine.cs index 62e604b..5723b67 100644 --- a/Src/Core/StateMachine/AsyncStateMachine.cs +++ b/Src/Core/StateMachine/AsyncStateMachine.cs @@ -29,7 +29,8 @@ namespace BITKit.StateMachine { _serviceProvider = new ServiceCollection().BuildServiceProvider(); } - public bool Enabled { get; set; } + + public bool Enabled { get; set; } = true; public T CurrentState { get; set; } private T _nextState; public event Action OnStateChanging; @@ -54,7 +55,15 @@ namespace BITKit.StateMachine CurrentState?.OnStateUpdate(deltaTime); if(_isBusy)return; using var _ = _isBusy.GetHandle(); - if (!_taskQueue.TryDequeue(out var task)) return; + if (!_taskQueue.TryDequeue(out var task)) + { + if(Enabled is false)return; + if (CurrentState is not null) + { + await CurrentState.OnStateUpdateAsync(deltaTime); + } + return; + } await task.task; if(_cancellationTokenSource.IsCancellationRequested|| Enabled is false)return; switch (task.state) @@ -64,8 +73,15 @@ namespace BITKit.StateMachine OnStateRegistered?.Invoke(task.value); break; case AsyncState.InEntering: - _nextState.OnStateEntry(_nextState); - OnStateChanged?.Invoke(CurrentState,_nextState); + if (_nextState is not null) + { + _nextState.OnStateEntry(_nextState); + OnStateChanged?.Invoke(CurrentState,_nextState); + } + else + { + OnStateChanged?.Invoke(CurrentState,default); + } CurrentState = _nextState; break; case AsyncState.InExiting: @@ -73,11 +89,7 @@ namespace BITKit.StateMachine break; } - if(Enabled is false)return; - if (CurrentState is not null) - { - await CurrentState.OnStateUpdateAsync(deltaTime); - } + } @@ -103,9 +115,7 @@ namespace BITKit.StateMachine } nextState = _serviceProvider.GetRequiredService(); _taskQueue.Enqueue(new(nextState.InitializeAsync(),AsyncState.Initializing,nextState)); - TransitionState(nextState); - - return nextState; + return TransitionState(nextState);; } public T TransitionState(T nextState) { @@ -120,8 +130,7 @@ namespace BITKit.StateMachine { _taskQueue.Enqueue(new(nextState.OnStateEntryAsync(nextState),AsyncState.InEntering,nextState)); } - - return nextState; + return _nextState= nextState; } public void Dispose()