diff --git a/Assets/TEngine/Runtime/Entity/Demo/ECSDemoApp.cs b/Assets/TEngine/Runtime/Entity/Demo/ECSDemoApp.cs index d2cde783..7e4cfb8d 100644 --- a/Assets/TEngine/Runtime/Entity/Demo/ECSDemoApp.cs +++ b/Assets/TEngine/Runtime/Entity/Demo/ECSDemoApp.cs @@ -1,4 +1,4 @@ -using TEngine; +using TEngine.EntityModule; using UnityEngine; public class EcsDemoApp : MonoBehaviour diff --git a/Assets/TEngine/Runtime/Entity/EcsObject.cs b/Assets/TEngine/Runtime/Entity/EcsObject.cs index 89a68ee1..f97d9c57 100644 --- a/Assets/TEngine/Runtime/Entity/EcsObject.cs +++ b/Assets/TEngine/Runtime/Entity/EcsObject.cs @@ -65,6 +65,14 @@ namespace TEngine.EntityModule { entityComponent.Entity.Updates.Remove(update); } + if (entityComponent is IFixedUpdate fixedupdate) + { + entityComponent.Entity.FixedUpdates.Remove(fixedupdate); + } + if (entityComponent is ILateUpdate lateupdate) + { + entityComponent.Entity.LateUpdates.Remove(lateupdate); + } if (reuse) { entityComponent.Entity.System.Push(entityComponent); @@ -82,11 +90,10 @@ namespace TEngine.EntityModule entityComponentTemp.OnDestroy(); if (reuse) { - entity.System.Push(entityComponentTemp); + Destroy(entityComponentTemp); } } - entity.Updates.Clear(); - entity.CanUpdate = false; + entity.IsDispose = true; if (reuse) { entity.System.Push(entity); diff --git a/Assets/TEngine/Runtime/Entity/Entity.cs b/Assets/TEngine/Runtime/Entity/Entity.cs index 7cdf728c..bf80a8e9 100644 --- a/Assets/TEngine/Runtime/Entity/Entity.cs +++ b/Assets/TEngine/Runtime/Entity/Entity.cs @@ -23,7 +23,7 @@ namespace TEngine.EntityModule #region Status [IgnoreDataMember] - private bool IsFromPool + internal bool IsFromPool { get => (this.status & EntityStatus.IsFromPool) == EntityStatus.IsFromPool; set @@ -40,7 +40,27 @@ namespace TEngine.EntityModule } [IgnoreDataMember] - private bool IsDispose => (this.status & EntityStatus.IsDispose) == EntityStatus.IsDispose; + internal bool IsDispose + { + get => (this.status & EntityStatus.IsDispose) == EntityStatus.IsDispose; + set + { + if (value) + { + this.status |= EntityStatus.IsDispose; + CanUpdate = false; + CanFixedUpdate = false; + CanLateUpdates = false; + Updates.Clear(); + FixedUpdates.Clear(); + LateUpdates.Clear(); + } + else + { + this.status &= ~EntityStatus.IsDispose; + } + } + } #endregion @@ -50,19 +70,19 @@ namespace TEngine.EntityModule internal List Updates = new List(); internal List FixedUpdates = new List(); internal List LateUpdates = new List(); - internal bool InActive; internal bool CanUpdate; + internal bool CanFixedUpdate; + internal bool CanLateUpdates; public int Index { get; set; } = -1; public Entity() { - InActive = true; System = EntitySystem.Instance; } ~Entity() { - InActive = false; + } internal void Update() diff --git a/Assets/TEngine/Runtime/Entity/EntityExt.cs b/Assets/TEngine/Runtime/Entity/EntityExt.cs index 3fee1aa0..ae317d8a 100644 --- a/Assets/TEngine/Runtime/Entity/EntityExt.cs +++ b/Assets/TEngine/Runtime/Entity/EntityExt.cs @@ -7,18 +7,9 @@ namespace TEngine.EntityModule { public void RmvComponent(T component) where T :EntityComponent, new() { - if (component is IUpdate update) - { - Updates.Remove(update); - } - else if (component is IFixedUpdate fixedUpdate) - { - FixedUpdates.Remove(fixedUpdate); - } - - CanUpdate = Updates.Count > 0; - Destroy(component); + + CheckUpdate(); } public T AddComponent() where T :EntityComponent, new() @@ -36,8 +27,11 @@ namespace TEngine.EntityModule { FixedUpdates.Add(fixedUpdate); } - CanUpdate = Updates.Count > 0; - + else if (component is ILateUpdate lateUpdate) + { + LateUpdates.Add(lateUpdate); + } + CheckUpdate(); return component; } @@ -55,7 +49,11 @@ namespace TEngine.EntityModule { FixedUpdates.Add(fixedUpdate); } - CanUpdate = Updates.Count > 0; + else if (component is ILateUpdate lateUpdate) + { + LateUpdates.Add(lateUpdate); + } + CheckUpdate(); return component; } @@ -125,5 +123,12 @@ namespace TEngine.EntityModule } return elements.ToArray(); } + + private void CheckUpdate() + { + CanUpdate = Updates.Count > 0; + CanFixedUpdate = FixedUpdates.Count > 0; + CanLateUpdates = LateUpdates.Count > 0; + } } } \ No newline at end of file diff --git a/Assets/TEngine/Runtime/Entity/EntitySystem.cs b/Assets/TEngine/Runtime/Entity/EntitySystem.cs index 0f333610..3a019359 100644 --- a/Assets/TEngine/Runtime/Entity/EntitySystem.cs +++ b/Assets/TEngine/Runtime/Entity/EntitySystem.cs @@ -81,6 +81,7 @@ namespace TEngine.EntityModule internal T Create() where T : Entity, new() { T entity = Get(); + entity.IsDispose = false; AddEntity(entity); return entity; }