From 5b3bce5476430e9b327cfec10c6082380181c757 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 28 Jun 2023 15:08:09 +0800 Subject: [PATCH] update --- src/EntityTemplate/EntityTemplate.cs | 11 ++- src/EntityTemplate/TemplateComponent.cs | 7 +- src/Extensions/EcsEntityConnect.cs | 108 ++++++++++++------------ src/Extensions/EcsEntityConnect.cs.meta | 2 +- src/Extensions/UnityComponents.cs | 57 ++++++------- 5 files changed, 98 insertions(+), 87 deletions(-) diff --git a/src/EntityTemplate/EntityTemplate.cs b/src/EntityTemplate/EntityTemplate.cs index 12a437f..26cc481 100644 --- a/src/EntityTemplate/EntityTemplate.cs +++ b/src/EntityTemplate/EntityTemplate.cs @@ -13,7 +13,16 @@ namespace DCFApixels.DragonECS foreach (var item in _components) item.Add(world, entityID); } - + private void OnValidate() + { + if (_components == null) return; + foreach (var item in _components) + { + if (item is ITemplateComponentOnValidate g) + g.OnValidate(gameObject); + } + + } private void OnDrawGizmos() { if (_components == null) return; diff --git a/src/EntityTemplate/TemplateComponent.cs b/src/EntityTemplate/TemplateComponent.cs index 9837e67..16b02fa 100644 --- a/src/EntityTemplate/TemplateComponent.cs +++ b/src/EntityTemplate/TemplateComponent.cs @@ -23,6 +23,10 @@ namespace DCFApixels.DragonECS Selected } } + public interface ITemplateComponentOnValidate + { + public void OnValidate(GameObject gameObject); + } [Serializable] public abstract class TemplateComponentInitializerBase @@ -73,7 +77,7 @@ namespace DCFApixels.DragonECS #endregion } [Serializable] - public abstract class TemplateComponentInitializer : TemplateComponentInitializerBase, ITemplateComponentName, ITemplateComponentGizmos + public abstract class TemplateComponentInitializer : TemplateComponentInitializerBase, ITemplateComponentName, ITemplateComponentGizmos, ITemplateComponentOnValidate { private static string _autoname = GetName(typeof(T)); private static Color _autoColor = GetColor(typeof(T)); @@ -94,6 +98,7 @@ namespace DCFApixels.DragonECS public abstract void Add(EcsWorld w, int e); public virtual void OnGizmos(Transform transform, ITemplateComponentGizmos.Mode mode) { } + public virtual void OnValidate(GameObject gameObject) { } } internal static class ITemplateBrowsableExt diff --git a/src/Extensions/EcsEntityConnect.cs b/src/Extensions/EcsEntityConnect.cs index 7ffe3c4..97d1ea7 100644 --- a/src/Extensions/EcsEntityConnect.cs +++ b/src/Extensions/EcsEntityConnect.cs @@ -78,75 +78,75 @@ namespace DCFApixels.DragonECS t.Apply(_world, entityID); } } +} + + #if UNITY_EDITOR - namespace Editors +namespace DCFApixels.DragonECS.Editors +{ + using System.Collections.Generic; + using UnityEditor; + + [CustomEditor(typeof(EcsEntityConnect))] + public class EcsEntityEditor : Editor { - using System.Collections.Generic; - using UnityEditor; + private EcsEntityConnect Target => (EcsEntityConnect)target; + private GUIStyle _greenStyle; + private GUIStyle _redStyle; - [CustomEditor(typeof(EcsEntityConnect))] - public class EcsEntityEditor : Editor + private bool _isInit = false; + + private void Init() { - private EcsEntityConnect Target => (EcsEntityConnect)target; - private GUIStyle _greenStyle; - private GUIStyle _redStyle; + if (_isInit) + return; + _greenStyle = EcsEditor.GetStyle(new Color32(75, 255, 0, 100)); + _redStyle = EcsEditor.GetStyle(new Color32(255, 0, 75, 100)); - private bool _isInit = false; + _isInit = true; + } - private void Init() + public override void OnInspectorGUI() + { + Init(); + if (Target.IsAlive) + GUILayout.Box("Connected", _greenStyle, GUILayout.ExpandWidth(true)); + else + GUILayout.Box("Not connected", _redStyle, GUILayout.ExpandWidth(true)); + + if (Target.Entity.TryGetID(out int id)) + EditorGUILayout.IntField(id); + else + EditorGUILayout.IntField(0); + GUILayout.Label(Target.Entity.ToString()); + + base.OnInspectorGUI(); + + if (GUILayout.Button("Autoset Templates")) { - if (_isInit) - return; + Target.SetTemplates_Editor(Target.GetComponents()); - _greenStyle = EcsEditor.GetStyle(new Color32(75, 255, 0, 100)); - _redStyle = EcsEditor.GetStyle(new Color32(255, 0, 75, 100)); - - - _isInit = true; + EditorUtility.SetDirty(target); + } + if (GUILayout.Button("Autoset Templates Cascade")) + { + foreach (var item in Target.GetComponentsInChildren()) + { + item.SetTemplates_Editor(item.GetComponents()); + EditorUtility.SetDirty(item); + } } - public override void OnInspectorGUI() + if (Target.IsAlive) { - Init(); - if (Target.IsAlive) - GUILayout.Box("Connected", _greenStyle, GUILayout.ExpandWidth(true)); - else - GUILayout.Box("Not connected", _redStyle, GUILayout.ExpandWidth(true)); - - if (Target.Entity.TryGetID(out int id)) - EditorGUILayout.IntField(id); - else - EditorGUILayout.IntField(0); - GUILayout.Label(Target.Entity.ToString()); - - base.OnInspectorGUI(); - - if (GUILayout.Button("Autoset Templates")) - { - Target.SetTemplates_Editor(Target.GetComponents()); - - EditorUtility.SetDirty(target); - } - if (GUILayout.Button("Autoset Templates Cascade")) - { - foreach (var item in Target.GetComponentsInChildren()) - { - item.SetTemplates_Editor(item.GetComponents()); - EditorUtility.SetDirty(item); - } - } - - if (Target.IsAlive) - { - List comps = new List(); - Target.World.GetComponents(Target.Entity.ID, comps); - GUILayout.TextArea(string.Join("\r\n", comps)); - } + List comps = new List(); + Target.World.GetComponents(Target.Entity.ID, comps); + GUILayout.TextArea(string.Join("\r\n", comps)); } } } -#endif } +#endif \ No newline at end of file diff --git a/src/Extensions/EcsEntityConnect.cs.meta b/src/Extensions/EcsEntityConnect.cs.meta index aff4433..302c05e 100644 --- a/src/Extensions/EcsEntityConnect.cs.meta +++ b/src/Extensions/EcsEntityConnect.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cdc92b01ccc1e684f955830aa7cea7d4 +guid: 495156623a7b1e94087f916ba42745e6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/src/Extensions/UnityComponents.cs b/src/Extensions/UnityComponents.cs index 5f539ba..120219a 100644 --- a/src/Extensions/UnityComponents.cs +++ b/src/Extensions/UnityComponents.cs @@ -2,97 +2,94 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -using UnityEngine.Scripting.APIUpdating; namespace DCFApixels.DragonECS { [Serializable] [DebugColor(255 / 3, 255, 0)] public struct UnityComponent : IEcsComponent, IEnumerable//IntelliSense hack - where T : class + where T : Component { public T obj; - IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException(); //IntelliSense hack IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException(); //IntelliSense hack } - [Serializable] - [MovedFrom(false, "Client", null, "RefRigitBodyInitializer")] - public sealed class UnityComponentRigitBodyInitializer : TemplateComponentInitializer> + + public class UnityComponentInitializer : TemplateComponentInitializer> where T : Component + { + public override string Name => "UnityComponent/" + typeof(T).Name; + public sealed override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; + public override void OnValidate(GameObject gameObject) + { + if (component.obj == null) + component.obj = gameObject.GetComponent(); + } + } + + + [Serializable] + public sealed class UnityComponentRigitBodyInitializer : UnityComponentInitializer { - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - [MovedFrom(false, "Client", null, "RefAnimatorInitializer")] - public sealed class UnityComponentAnimatorInitializer : TemplateComponentInitializer> + public sealed class UnityComponentAnimatorInitializer : UnityComponentInitializer { - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentCharacterControllerInitializer : TemplateComponentInitializer> + public sealed class UnityComponentCharacterControllerInitializer : UnityComponentInitializer { - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } #region Colliders [Serializable] - public sealed class UnityComponentColliderInitializer : TemplateComponentInitializer> + public sealed class UnityComponentColliderInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Collider/" + nameof(Collider); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentBoxColliderInitializer : TemplateComponentInitializer> + public sealed class UnityComponentBoxColliderInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Collider/" + nameof(BoxCollider); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentSphereColliderInitializer : TemplateComponentInitializer> + public sealed class UnityComponentSphereColliderInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Collider/" + nameof(SphereCollider); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentCapsuleColliderInitializer : TemplateComponentInitializer> + public sealed class UnityComponentCapsuleColliderInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Collider/" + nameof(CapsuleCollider); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentMeshColliderInitializer : TemplateComponentInitializer> + public sealed class UnityComponentMeshColliderInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Collider/" + nameof(MeshCollider); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } #endregion #region Joints [Serializable] - public sealed class UnityComponentJointInitializer : TemplateComponentInitializer> + public sealed class UnityComponentJointInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Joint/" + nameof(Joint); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentFixedJointInitializer : TemplateComponentInitializer> + public sealed class UnityComponentFixedJointInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Joint/" + nameof(FixedJoint); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentCharacterJointInitializer : TemplateComponentInitializer> + public sealed class UnityComponentCharacterJointInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Joint/" + nameof(CharacterJoint); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } [Serializable] - public sealed class UnityComponentConfigurableJointInitializer : TemplateComponentInitializer> + public sealed class UnityComponentConfigurableJointInitializer : UnityComponentInitializer { public override string Name => "UnityComponent/Joint/" + nameof(ConfigurableJoint); - public override void Add(EcsWorld w, int e) => w.GetPool>().Add(e) = component; } #endregion }