using System; using System.Collections.Generic; namespace _Project.Develop.Runtime.Entities { public partial class Entity : IDisposable { public event Action Initialized; private readonly Dictionary _components = new(); private readonly List _systems = new(); private readonly List _initializables = new(); private readonly List _updatables = new(); private readonly List _disposables = new(); private bool _isInit; public bool IsInit => _isInit; public void Initialize() { foreach (IInitializableSystem initializable in _initializables) initializable.OnInit(this); _isInit = true; Initialized?.Invoke(this); } public void OnUpdate(float deltaTime) { if (_isInit == false) return; foreach (IUpdatableSystem updatable in _updatables) updatable.OnUpdate(deltaTime); } public void Dispose() { foreach (IDisposableSystem disposable in _disposables) disposable.OnDispose(); _isInit = false; } public Entity AddComponent(TComponent component) where TComponent : class, IEntityComponent { _components.Add(typeof(TComponent), component); return this; } public bool HasComponent() where TComponent : class, IEntityComponent { return _components.ContainsKey(typeof(TComponent)); } public bool TryGetComponent(out TComponent component) where TComponent : class, IEntityComponent { if(_components.TryGetValue(typeof(TComponent), out IEntityComponent findedObject)) { component = (TComponent)findedObject; return true; } component = null; return false; } public TComponent GetComponent() where TComponent : class, IEntityComponent { if (TryGetComponent(out TComponent component) == false) throw new ArgumentException($"Entity not exist {typeof(TComponent)}"); return component; } public Entity AddSystem(IEntitySystem system) { if (_systems.Contains(system)) throw new ArgumentException(system.GetType().ToString()); _systems.Add(system); if (system is IInitializableSystem initializable) { _initializables.Add(initializable); if (_isInit) initializable.OnInit(this); } if (system is IUpdatableSystem updatable) _updatables.Add(updatable); if (system is IDisposableSystem disposable) _disposables.Add(disposable); return this; } } }