From a3a5326ca07d35a18dc6c8006d0348be3ccaf56b Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sat, 10 Jun 2023 19:43:19 +0800 Subject: [PATCH] add init method for wrold components/ bug fix --- src/EcsWorld.cs | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index faf92f2..aa183fb 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -120,54 +120,56 @@ namespace DCFApixels.DragonECS #endif public TPool GetPool() where TPool : IEcsPoolImplementation, new() { - int uniqueID = WorldMetaStorage.GetPoolID(_worldTypeID); - if (uniqueID >= _pools.Length) + int index = WorldMetaStorage.GetPoolID(_worldTypeID); + if (index >= _pools.Length) { int oldCapacity = _pools.Length; Array.Resize(ref _pools, _pools.Length << 1); ArrayUtility.Fill(_pools, _nullPool, oldCapacity, oldCapacity - _pools.Length); } - if (_pools[uniqueID] == _nullPool) + if (_pools[index] == _nullPool) { var pool = new TPool(); - _pools[uniqueID] = pool; - pool.OnInit(this, uniqueID); + _pools[index] = pool; + pool.OnInit(this, index); } - return (TPool)_pools[uniqueID]; + return (TPool)_pools[index]; } public TSubject GetSubject() where TSubject : EcsSubject { - int uniqueID = WorldMetaStorage.GetSubjectID(_worldTypeID); - if (uniqueID >= _subjects.Length) + int index = WorldMetaStorage.GetSubjectID(_worldTypeID); + if (index >= _subjects.Length) Array.Resize(ref _subjects, _subjects.Length << 1); - if (_subjects[uniqueID] == null) - _subjects[uniqueID] = EcsSubject.Builder.Build(this); - return (TSubject)_subjects[uniqueID]; + if (_subjects[index] == null) + _subjects[index] = EcsSubject.Builder.Build(this); + return (TSubject)_subjects[index]; } public TExecutor GetExecutor() where TExecutor : EcsQueryExecutor, new() { int index = WorldMetaStorage.GetExecutorID(_worldTypeID); if (index >= _executors.Length) Array.Resize(ref _executors, _executors.Length << 1); - if (_executors[index] == null) + var result = _executors[index]; + if (result == null) { - var executor = new TExecutor(); - executor.Initialize(this); - _executors[index] = executor; + result = new TExecutor(); + _executors[index] = result; + result.Initialize(this); } - return (TExecutor)_executors[index]; + return (TExecutor)result; } public T Get() where T : class, new() { int index = WorldMetaStorage.GetWorldComponentID(_worldTypeID); if (index >= _components.Length) - Array.Resize(ref _executors, _executors.Length << 1); - + Array.Resize(ref _components, _components.Length << 1); var result = _components[index]; if (result == null) { result = new T(); _components[index] = result; + if (result is IEcsWorldComponent component) + component.Init(this); } return (T)result; } @@ -411,6 +413,10 @@ namespace DCFApixels.DragonECS } #region Callbacks Interface + public interface IEcsWorldComponent + { + void Init(EcsWorld world); + } public interface IEcsWorldEventListener { void OnWorldResize(int newSize);