From 73916a4f8d436c5301645c70c137956b16c6fc11 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:24:39 +0800 Subject: [PATCH] fixes --- src/Connectors/EcsEntityConnect.cs | 2 +- src/Connectors/EcsWorldProvider.cs | 4 +++- .../Editor/EcsEntityConnectEditor.cs | 11 ++++++---- .../Editor/EcsWorldProviderBaseEditor.cs | 20 +++++++++++++------ .../Monitors/Editor/EntityMonitorEditor.cs | 4 ++-- src/Debug/Monitors/WorldMonitor.cs | 18 ++++++++++++----- src/Debug/UnityDebugService.cs | 2 +- src/Internal/Editor/EcsGUI.cs | 4 ++-- src/Internal/EntLongExtentions.cs | 12 +++++++++++ src/Internal/EntLongExtentions.cs.meta | 11 ++++++++++ 10 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 src/Internal/EntLongExtentions.cs create mode 100644 src/Internal/EntLongExtentions.cs.meta diff --git a/src/Connectors/EcsEntityConnect.cs b/src/Connectors/EcsEntityConnect.cs index 73f226d..e56c448 100644 --- a/src/Connectors/EcsEntityConnect.cs +++ b/src/Connectors/EcsEntityConnect.cs @@ -130,7 +130,7 @@ namespace DCFApixels.DragonECS return; } _isConnectInvoked = false; - if (_entity.TryGetID(out int oldEntityID) && _world != null) + if (_world.IsNullOrDetroyed() == false && _entity.TryGetID(out int oldEntityID)) { var unityGameObjects = _world.GetPool(); unityGameObjects.TryDel(oldEntityID); diff --git a/src/Connectors/EcsWorldProvider.cs b/src/Connectors/EcsWorldProvider.cs index 21145d2..c9623a8 100644 --- a/src/Connectors/EcsWorldProvider.cs +++ b/src/Connectors/EcsWorldProvider.cs @@ -1,5 +1,7 @@ using System; using UnityEngine; + + #if UNITY_EDITOR using UnityEditor; #endif @@ -87,7 +89,7 @@ namespace DCFApixels.DragonECS { if (_world == null || _world.IsDestroyed) { - _world = BuildWorld(); + Set(BuildWorld()); OnWorldCreated(_world); } return _world; diff --git a/src/Connectors/Editor/EcsEntityConnectEditor.cs b/src/Connectors/Editor/EcsEntityConnectEditor.cs index 453144e..61c3345 100644 --- a/src/Connectors/Editor/EcsEntityConnectEditor.cs +++ b/src/Connectors/Editor/EcsEntityConnectEditor.cs @@ -40,9 +40,9 @@ namespace DCFApixels.DragonECS.Unity.Editors private void DrawEntityInfo(EcsEntityConnect[] targets) { - bool isConnected = Target.Entity.TryUnpack(out int id, out short gen, out EcsWorld world); + bool isConnected = Target.Entity.TryUnpackForUnityEditor(out int id, out short gen, out short worldID, out EcsWorld world); EcsGUI.EntityStatus status = IsMultipleTargets ? EcsGUI.EntityStatus.Undefined : isConnected ? EcsGUI.EntityStatus.Alive : EcsGUI.EntityStatus.NotAlive; - EcsGUI.Layout.EntityBar(status, id, gen, world.id); + EcsGUI.Layout.EntityBar(status, id, gen, worldID); } private void DrawTemplates() @@ -116,9 +116,12 @@ namespace DCFApixels.DragonECS.Unity.Editors } } } - if (Target.Entity.TryUnpack(out int entityID, out EcsWorld world)) + if (Target.Entity.TryUnpackForUnityEditor(out int entityID, out short gen, out short worldID, out EcsWorld world)) { - EcsGUI.Layout.DrawRuntimeComponents(entityID, world); + if (world.IsNullOrDetroyed() == false) + { + EcsGUI.Layout.DrawRuntimeComponents(entityID, world); + } } } } diff --git a/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs b/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs index 93cee9f..5d46751 100644 --- a/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs +++ b/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs @@ -12,16 +12,24 @@ namespace DCFApixels.DragonECS.Unity.Editors public override void OnInspectorGUI() { - if (Target.IsEmpty) + EcsWorld world = Target.GetCurrentWorldRaw(); + if (world == null) { var style = UnityEditorUtility.GetStyle(new Color32(255, 0, 75, 100)); GUILayout.Box("Is Empty", style, GUILayout.ExpandWidth(true)); } else { - var style = UnityEditorUtility.GetStyle(new Color32(75, 255, 0, 100)); - EcsWorld world = Target.GetRaw(); - GUILayout.Box($"{world.GetMeta().Name} ( {world.id} )", style, GUILayout.ExpandWidth(true)); + if (world.IsDestroyed) + { + var style = UnityEditorUtility.GetStyle(new Color32(255, 75, 0, 100)); + GUILayout.Box($"{world.GetMeta().Name} ( {world.id} ) Destroyed", style, GUILayout.ExpandWidth(true)); + } + else + { + var style = UnityEditorUtility.GetStyle(new Color32(75, 255, 0, 100)); + GUILayout.Box($"{world.GetMeta().Name} ( {world.id} )", style, GUILayout.ExpandWidth(true)); + } } EcsGUI.Layout.DrawWorldBaseInfo(Target.GetCurrentWorldRaw()); @@ -30,9 +38,9 @@ namespace DCFApixels.DragonECS.Unity.Editors GUILayout.Space(10); - if (GUILayout.Button("Destroy")) + if (GUILayout.Button("Destroy & Clear")) { - var w = Target.GetRaw(); + var w = Target.GetCurrentWorldRaw(); if (w != null && w.IsDestroyed == false) { w.Destroy(); diff --git a/src/Debug/Monitors/Editor/EntityMonitorEditor.cs b/src/Debug/Monitors/Editor/EntityMonitorEditor.cs index 9bbbeba..8db5274 100644 --- a/src/Debug/Monitors/Editor/EntityMonitorEditor.cs +++ b/src/Debug/Monitors/Editor/EntityMonitorEditor.cs @@ -11,8 +11,8 @@ namespace DCFApixels.DragonECS.Unity.Editors public override void OnInspectorGUI() { - bool isAlive = Target.Entity.TryUnpack(out int id, out short gen, out EcsWorld world); - EcsGUI.Layout.EntityBar(isAlive ? EcsGUI.EntityStatus.Alive : EcsGUI.EntityStatus.NotAlive, id, gen, world.id); + bool isAlive = Target.Entity.TryUnpackForUnityEditor(out int id, out short gen, out short worldID, out EcsWorld world); + EcsGUI.Layout.EntityBar(isAlive ? EcsGUI.EntityStatus.Alive : EcsGUI.EntityStatus.NotAlive, id, gen, worldID); EcsGUI.Layout.DrawRuntimeComponents(Target.Entity, false); } } diff --git a/src/Debug/Monitors/WorldMonitor.cs b/src/Debug/Monitors/WorldMonitor.cs index bb20da0..8408c7d 100644 --- a/src/Debug/Monitors/WorldMonitor.cs +++ b/src/Debug/Monitors/WorldMonitor.cs @@ -41,18 +41,26 @@ namespace DCFApixels.DragonECS.Unity.Internal } public void Init() { + if (_world == null) + { + return; + } TypeMeta meta = _world.GetMeta(); _monitor = new GameObject($"{UnityEditorUtility.TransformToUpperName(meta.Name)} ( {_world.id} )").AddComponent(); UnityEngine.Object.DontDestroyOnLoad(_monitor); _monitor.Set(_world); _monitor.gameObject.SetActive(false); - _entityMonitorsPoolRoot = new GameObject("__POOL").transform; + _entityMonitorsPoolRoot = new GameObject("__pool__").transform; _entityMonitorsPoolRoot.SetParent(_monitor.transform); - foreach (var e in _world.Entities) + + if (_world.IsNullOrDetroyed() == false) { - InitNewEntity(e, false); + foreach (var e in _world.Entities) + { + InitNewEntity(e, false); + } } } @@ -65,8 +73,8 @@ namespace DCFApixels.DragonECS.Unity.Internal { if (Application.isPlaying) { - UnityEngine.Object.Destroy(_monitor); - UnityEngine.Object.Destroy(_entityMonitorsPoolRoot); + UnityEngine.Object.Destroy(_monitor.gameObject); + UnityEngine.Object.Destroy(_entityMonitorsPoolRoot.gameObject); } _monitor = null; _entityMonitorsPoolRoot = null; diff --git a/src/Debug/UnityDebugService.cs b/src/Debug/UnityDebugService.cs index f29ed63..00a0e15 100644 --- a/src/Debug/UnityDebugService.cs +++ b/src/Debug/UnityDebugService.cs @@ -29,7 +29,7 @@ namespace DCFApixels.DragonECS bool hasTag = string.IsNullOrEmpty(tag) == false; if (hasTag) { - log = $".[{tag}] {v}"; + log = $"[{tag}] {v}"; string taglower = tag.ToLower(); if (taglower.Contains("warning")) { diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index 5d13281..e0d1600 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -293,7 +293,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public static void DrawWorldBaseInfo(EcsWorld world) { - bool isNull = world == null || world.id == 0; + bool isNull = world == null || world.IsDestroyed || world.id == 0; int entitesCount = isNull ? 0 : world.Count; int capacity = isNull ? 0 : world.Capacity; int leakedEntitesCount = isNull ? 0 : world.CountLeakedEntitesDebug(); @@ -321,7 +321,7 @@ namespace DCFApixels.DragonECS.Unity.Editors } public static void DrawRuntimeComponents(entlong entity, bool isWithFoldout = true) { - if (entity.TryUnpack(out int entityID, out EcsWorld world)) + if (entity.TryUnpackForUnityEditor(out int entityID, out _, out _, out EcsWorld world)) { DrawRuntimeComponents(entityID, world, isWithFoldout); } diff --git a/src/Internal/EntLongExtentions.cs b/src/Internal/EntLongExtentions.cs new file mode 100644 index 0000000..7e5c53c --- /dev/null +++ b/src/Internal/EntLongExtentions.cs @@ -0,0 +1,12 @@ +namespace DCFApixels.DragonECS.Unity.Internal +{ + internal static class EntLongExtentions + { + public static bool TryUnpackForUnityEditor(this entlong self, out int id, out short gen, out short worldID, out EcsWorld world) + { + self.UnpackUnchecked(out id, out gen, out worldID); + world = EcsWorld.GetWorld(worldID); + return world.IsNullOrDetroyed() == false && self.IsAlive; + } + } +} diff --git a/src/Internal/EntLongExtentions.cs.meta b/src/Internal/EntLongExtentions.cs.meta new file mode 100644 index 0000000..288dae6 --- /dev/null +++ b/src/Internal/EntLongExtentions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aac4ee165dbc67241a5291d47a9da9fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: