diff --git a/src/Connectors/AutoEntityCreator.cs b/src/Connectors/AutoEntityCreator.cs index 18f423c..773360f 100644 --- a/src/Connectors/AutoEntityCreator.cs +++ b/src/Connectors/AutoEntityCreator.cs @@ -2,74 +2,96 @@ using UnityEngine; namespace DCFApixels.DragonECS { - public static class EcsDefaultWorldBuilder + public class AutoEntityCreator : MonoBehaviour { - public static EcsDefaultWorld Build() + [SerializeField] + private EcsEntityConnect _connect; + [SerializeField] + private EcsWorldProviderBase _world; + + private bool _created; + + #region Properties + public EcsEntityConnect Connect => _connect; + #endregion + + #region UnityEvents + private void OnValidate() { - return new EcsDefaultWorld(); + if (_world == null) + { + AutoResolveWorldProviderDependensy(); + } } - } - - namespace Project.Unity - { - public class AutoEntityCreator : MonoBehaviour + private void Start() { - [SerializeField] - private EcsEntityConnect _connect; - [SerializeField] - private EcsWorldProviderBase _world; - private bool _created; + CreateEntity(); + } + #endregion - #region Properties - public EcsEntityConnect Connect => _connect; - #endregion - - #region UnityEvents - private void OnValidate() + private void AutoResolveWorldProviderDependensy() + { + _world = EcsDefaultWorldSingletonProvider.Instance; + } + public void ManualStart() + { + CreateEntity(); + } + private void CreateEntity() + { + if (_created) { - if (_world == null) + return; + } + if (_world == null) + { + AutoResolveWorldProviderDependensy(); + } + else + { + InitConnect(_connect, _world.GetRaw()); + } + _created = true; + } + + private void InitConnect(EcsEntityConnect connect, EcsWorld world) + { + connect.ConnectWith(world.NewEntityLong()); + connect.ApplyTemplates(); + } + +#if UNITY_EDITOR + internal void Autoset_Editor() + { + _connect = GetComponentInChildren(); + } +#endif + } +} + +#if UNITY_EDITOR +namespace DCFApixels.DragonECS.Unity.Editors +{ + using UnityEditor; + + [CustomEditor(typeof(AutoEntityCreator))] + [CanEditMultipleObjects] + public class AutoEntityCreatorEditor : Editor + { + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + if (GUILayout.Button("Autoset")) + { + foreach (var tr in targets) { - AutoResolveWorldProviderDependensy(); + AutoEntityCreator creator = (AutoEntityCreator)tr; + creator.Autoset_Editor(); + EditorUtility.SetDirty(creator); } } - private void Start() - { - - CreateEntity(); - } - #endregion - - private void AutoResolveWorldProviderDependensy() - { - _world = EcsDefaultWorldSingletonProvider.Instance; - } - public void ManualStart() - { - CreateEntity(); - } - private void CreateEntity() - { - if (_created) - { - return; - } - if (_world == null) - { - AutoResolveWorldProviderDependensy(); - } - else - { - InitConnect(_connect, _world.GetRaw()); - } - _created = true; - } - - private void InitConnect(EcsEntityConnect connect, EcsWorld world) - { - connect.ConnectWith(world.NewEntityLong()); - connect.ApplyTemplates(); - } } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/Connectors/EcsEntityConnect.cs b/src/Connectors/EcsEntityConnect.cs index 5da7a36..de9aa1f 100644 --- a/src/Connectors/EcsEntityConnect.cs +++ b/src/Connectors/EcsEntityConnect.cs @@ -91,7 +91,9 @@ namespace DCFApixels.DragonECS #if UNITY_EDITOR namespace DCFApixels.DragonECS.Unity.Editors { + using DCFApixels.DragonECS.Unity.Internal; using UnityEditor; + using static Codice.CM.WorkspaceServer.WorkspaceTreeDataStore; [CustomEditor(typeof(EcsEntityConnect))] [CanEditMultipleObjects] @@ -120,8 +122,7 @@ namespace DCFApixels.DragonECS.Unity.Editors } DrawTop(); - DrawConnectStatus(targets); - DrawEntityInfo(); + DrawEntityInfo(targets); DrawTemplates(); @@ -132,57 +133,48 @@ namespace DCFApixels.DragonECS.Unity.Editors { var iterator = serializedObject.GetIterator(); iterator.NextVisible(true); - using (new EditorGUI.DisabledScope("m_Script" == iterator.propertyPath)) + using (new EditorGUI.DisabledScope(true)) { EditorGUILayout.PropertyField(iterator, true); } } - private void DrawConnectStatus(EcsEntityConnect[] targets) - { - bool isConnected = Target.IsConected; - for (int i = 0; i < targets.Length; i++) - { - if (isConnected != targets[i].IsConected) - { - isConnected = !Target.IsConected; - break; - } - } - if (isConnected == Target.IsConected) - { - EcsGUI.Layout.DrawConnectStatus(Target.IsConected); - } - else - { - EcsGUI.Layout.DrawUndeterminedConnectStatus(); - } - } - private void DrawEntityInfo() + private void DrawEntityInfo(EcsEntityConnect[] targets) { - GUILayout.Label(string.Empty); - Rect entityRect = GUILayoutUtility.GetLastRect(); - Rect idRect = entityRect; - idRect.xMax -= idRect.width / 2f; - Rect genRect = entityRect; - genRect.xMin = idRect.xMax; - genRect.xMax -= genRect.width / 2f; - Rect worldRect = genRect; - worldRect.x += worldRect.width; + float width = EditorGUIUtility.currentViewWidth; + float height = EditorGUIUtility.singleLineHeight; + Rect entityRect = GUILayoutUtility.GetRect(width, height + 3f); - if (IsMultipleTargets == false && Target.Entity.TryUnpack(out int id, out short gen, out short world)) + var (entityInfoRect, statusRect) = RectUtility.VerticalSliceBottom(entityRect, 3f); + + var (idRect, genWorldRect) = RectUtility.HorizontalSliceLerp(entityInfoRect, 0.5f); + var (genRect, worldRect) = RectUtility.HorizontalSliceLerp(genWorldRect, 0.5f); + + + + bool isConnected = Target.Entity.TryUnpack(out int id, out short gen, out short world); + + + if (IsMultipleTargets == false && isConnected) { + Color statusColor = EcsGUI.GreenColor; + statusColor.a = 0.32f; + EditorGUI.DrawRect(statusRect, statusColor); EditorGUI.IntField(idRect, id); EditorGUI.IntField(genRect, gen); EditorGUI.IntField(worldRect, world); } else { - GUI.enabled = false; - EditorGUI.TextField(idRect, "Entity ID"); - EditorGUI.TextField(genRect, "Gen"); - EditorGUI.TextField(worldRect, "World ID"); - GUI.enabled = true; + using (new EditorGUI.DisabledScope(true)) + { + Color statusColor = IsMultipleTargets ? EcsGUI.GrayColor : EcsGUI.RedColor; + statusColor.a = 0.32f; + EditorGUI.DrawRect(statusRect, statusColor); + EditorGUI.TextField(idRect, "Entity ID"); + EditorGUI.TextField(genRect, "Gen"); + EditorGUI.TextField(worldRect, "World ID"); + } } } @@ -193,22 +185,20 @@ namespace DCFApixels.DragonECS.Unity.Editors bool enterChildren = true; while (iterator.NextVisible(enterChildren)) { - using (new EditorGUI.DisabledScope("m_Script" == iterator.propertyPath)) - { - EditorGUILayout.PropertyField(iterator, true); - } + EditorGUILayout.PropertyField(iterator, true); enterChildren = false; } } private void DrawButtons() { - if (GUILayout.Button("Autoset Templates")) + GUILayout.BeginHorizontal(); + if (GUILayout.Button("Autoset")) { Target.SetTemplates_Editor(Target.GetComponents()); EditorUtility.SetDirty(target); } - if (GUILayout.Button("Autoset Templates Cascade")) + if (GUILayout.Button("Autoset Cascade")) { foreach (var item in Target.GetComponentsInChildren()) { @@ -216,6 +206,7 @@ namespace DCFApixels.DragonECS.Unity.Editors EditorUtility.SetDirty(item); } } + GUILayout.EndHorizontal(); } private void DrawComponents(EcsEntityConnect[] targets) @@ -227,13 +218,13 @@ namespace DCFApixels.DragonECS.Unity.Editors if (targets[i].IsConected == true) { EditorGUILayout.HelpBox("Multiple component editing is not available.", MessageType.Warning); - break; + return; } } } - if (Target.IsConected) + if (Target.Entity.TryUnpack(out int entityID, out EcsWorld world)) { - EcsGUI.Layout.DrawComponents(Target.Entity); + EcsGUI.Layout.DrawComponents(entityID, world); } } } diff --git a/src/Editor/EditorUtility.cs b/src/Editor/EditorUtility.cs index 7c07174..5272caa 100644 --- a/src/Editor/EditorUtility.cs +++ b/src/Editor/EditorUtility.cs @@ -1,7 +1,6 @@ #if UNITY_EDITOR using DCFApixels.DragonECS.Unity.Internal; using System; -using System.Collections.Generic; using System.Reflection; using System.Runtime.InteropServices; using System.Text; @@ -60,15 +59,15 @@ namespace DCFApixels.DragonECS.Unity.Editors } - public static class EcsGUI + internal static class EcsGUI { - private static Color _grayColor = new Color32(100, 100, 100, 100); - private static Color _greenColor = new Color32(75, 255, 0, 100); - private static Color _redColor = new Color32(255, 0, 75, 100); + internal readonly static Color GrayColor = new Color32(100, 100, 100, 255); + internal readonly static Color GreenColor = new Color32(75, 255, 0, 255); + internal readonly static Color RedColor = new Color32(255, 0, 75, 255); - private static GUIStyle _grayStyle; - private static GUIStyle _greenStyle; - private static GUIStyle _redStyle; + //private static GUIStyle _grayStyle; + //private static GUIStyle _greenStyle; + //private static GUIStyle _redStyle; private static GUILayoutOption[] _defaultParams; private static bool _isInit = false; @@ -81,62 +80,62 @@ namespace DCFApixels.DragonECS.Unity.Editors } _defaultParams = new GUILayoutOption[] { GUILayout.ExpandWidth(true) }; - _grayStyle = EcsEditor.GetStyle(_grayColor); - _greenStyle = EcsEditor.GetStyle(_greenColor); - _redStyle = EcsEditor.GetStyle(_redColor); + //_grayStyle = EcsEditor.GetStyle(GrayColor); + //_greenStyle = EcsEditor.GetStyle(GreenColor); + //_redStyle = EcsEditor.GetStyle(RedColor); _isInit = true; } - private const string CONNECTED = "Connected"; - private const string NOT_CONNECTED = "Not connected"; - private const string UNDETERMINED_CONNECTED = "---"; - public static void DrawConnectStatus(Rect position, bool status) - { - Init(); - if (status) - { - GUI.Box(position, CONNECTED, _greenStyle); - } - else - { - GUI.Box(position, NOT_CONNECTED, _redStyle); - } - } - - public static void DrawUndeterminedConnectStatus(Rect position) - { - Init(); - GUI.Box(position, UNDETERMINED_CONNECTED, _grayStyle); - } + //private const string CONNECTED = "Connected"; + //private const string NOT_CONNECTED = "Not connected"; + //private const string UNDETERMINED_CONNECTED = "---"; + //public static void DrawConnectStatus(Rect position, bool status) + //{ + // Init(); + // if (status) + // { + // GUI.Box(position, CONNECTED, _greenStyle); + // } + // else + // { + // GUI.Box(position, NOT_CONNECTED, _redStyle); + // } + //} + // + //public static void DrawUndeterminedConnectStatus(Rect position) + //{ + // Init(); + // GUI.Box(position, UNDETERMINED_CONNECTED, _grayStyle); + //} public static class Layout { - public static void DrawConnectStatus(bool status, params GUILayoutOption[] options) - { - Init(); - if (options == null || options.Length <= 0) - { - options = _defaultParams; - } - GUILayout.Box("", options); - Rect lastRect = GUILayoutUtility.GetLastRect(); - Color color = status ? _greenColor : _redColor; - string text = status ? CONNECTED : NOT_CONNECTED; - color.a = 0.6f; - EditorGUI.DrawRect(lastRect, color); - GUI.Box(lastRect, text); - } + //public static void DrawConnectStatus(bool status, params GUILayoutOption[] options) + //{ + // Init(); + // if (options == null || options.Length <= 0) + // { + // options = _defaultParams; + // } + // GUILayout.Box("", options); + // Rect lastRect = GUILayoutUtility.GetLastRect(); + // Color color = status ? GreenColor : RedColor; + // string text = status ? CONNECTED : NOT_CONNECTED; + // color.a = 0.6f; + // EditorGUI.DrawRect(lastRect, color); + // GUI.Box(lastRect, text); + //} - public static void DrawUndeterminedConnectStatus(params GUILayoutOption[] options) - { - Init(); - if (options == null || options.Length <= 0) - { - options = _defaultParams; - } - GUILayout.Box(UNDETERMINED_CONNECTED, _grayStyle, options); - } + //public static void DrawUndeterminedConnectStatus(params GUILayoutOption[] options) + //{ + // Init(); + // if (options == null || options.Length <= 0) + // { + // options = _defaultParams; + // } + // GUILayout.Box(UNDETERMINED_CONNECTED, _grayStyle, options); + //} public static void DrawComponents(entlong entity) { if (entity.TryUnpack(out int entityID, out EcsWorld world)) @@ -147,17 +146,18 @@ namespace DCFApixels.DragonECS.Unity.Editors public static void DrawComponents(int entityID, EcsWorld world) { var componentTypeIDs = world.GetComponentTypeIDs(entityID); - + GUILayout.BeginVertical(EcsEditor.GetStyle(Color.black, 0.2f)); foreach (var componentTypeID in componentTypeIDs) { var pool = world.GetPool(componentTypeID); { - DrawComponent(entityID, world, pool); + DrawComponent(entityID, pool); } } + GUILayout.EndVertical(); } private static readonly BindingFlags fieldFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - private static void DrawComponent(int entityID, EcsWorld world, IEcsPool pool) + private static void DrawComponent(int entityID, IEcsPool pool) { object data = pool.GetRaw(entityID); var meta = data.GetMeta(); @@ -176,27 +176,19 @@ namespace DCFApixels.DragonECS.Unity.Editors GUILayout.EndVertical(); - Rect lineRect = GUILayoutUtility.GetLastRect(); - lineRect.y = lineRect.yMax; - lineRect.height = 3f; - Color rectColor = panelColor; - rectColor.a = 0.34f; - EditorGUI.DrawRect(lineRect, rectColor); - GUILayout.Space(2f); } private static bool DrawData(Type fieldType, GUIContent label, ExpandMatrix expandMatrix, object data, out object outData) { Type type = data.GetType(); - var uobj = data as UnityEngine.Object; + UnityEngine.Object uobj = data as UnityEngine.Object; ref bool isExpanded = ref expandMatrix.Down(); + bool changed = false; + outData = data; - if ((uobj == false && type.IsGenericType) || - (uobj == false && !type.IsSerializable)) + if (uobj == null && (type.IsGenericType || !type.IsSerializable)) { - bool result = false; - isExpanded = EditorGUILayout.Foldout(isExpanded, label); if (isExpanded) @@ -208,16 +200,13 @@ namespace DCFApixels.DragonECS.Unity.Editors if (DrawData(field.FieldType, subLabel, expandMatrix, field.GetValue(data), out object fieldData)) { field.SetValue(data, fieldData); - result = true; + + outData = fieldData; + changed = true; } } EditorGUI.indentLevel--; } - - expandMatrix.Up(); - - outData = data; - return result; } else { @@ -228,19 +217,16 @@ namespace DCFApixels.DragonECS.Unity.Editors EditorGUILayout.PropertyField(w.Property, label, true); isExpanded = w.IsExpanded; - w.Release(); - expandMatrix.Up(); - if (EditorGUI.EndChangeCheck()) { w.SO.ApplyModifiedProperties(); outData = w.Data; - return true; + changed = true; } - - outData = data; - return false; } + + expandMatrix.Up(); + return changed; } } } diff --git a/src/Editor/ExpandMatrix.cs b/src/Editor/ExpandMatrix.cs index b3afb6d..8bf25c0 100644 --- a/src/Editor/ExpandMatrix.cs +++ b/src/Editor/ExpandMatrix.cs @@ -11,7 +11,7 @@ namespace DCFApixels.DragonECS.Unity.Editors private static Dictionary _instances = new Dictionary(); public static ExpandMatrix Take(Type type) { - if(_instances.TryGetValue(type, out ExpandMatrix result) == false) + if (_instances.TryGetValue(type, out ExpandMatrix result) == false) { result = new ExpandMatrix(); _instances.Add(type, result); diff --git a/src/Editor/RectUtility.cs b/src/Editor/RectUtility.cs new file mode 100644 index 0000000..97c99af --- /dev/null +++ b/src/Editor/RectUtility.cs @@ -0,0 +1,41 @@ +using UnityEngine; + +namespace DCFApixels.DragonECS.Unity.Internal +{ + internal static class RectUtility + { + public static (Rect, Rect) HorizontalSliceLerp(Rect rect, float t) + { + Rect l = rect; + Rect r = rect; + l.xMax -= rect.width * (1f - t); + r.xMin += rect.width * t; + return (l, r); + } + public static (Rect, Rect) HorizontalSliceLeft(Rect rect, float with) + { + Rect l = rect; + Rect r = rect; + l.xMax = l.xMin + with; + r.xMin += with; + return (l, r); + } + public static (Rect, Rect) HorizontalSliceRight(Rect rect, float with) + { + Rect l = rect; + Rect r = rect; + l.xMax -= with; + r.xMin = r.xMax - with; + return (l, r); + } + + public static (Rect, Rect) VerticalSliceBottom(Rect rect, float height) + { + Rect t = rect; + Rect b = rect; + t.yMax -= height; + b.yMin = b.yMax - height; + return (t, b); + } + } +} diff --git a/src/Editor/RectUtility.cs.meta b/src/Editor/RectUtility.cs.meta new file mode 100644 index 0000000..f61539f --- /dev/null +++ b/src/Editor/RectUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e275376d670bdd4c986d661838ed6b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Editor/SOWrappers/RefEditorWrapper.cs b/src/Editor/SOWrappers/RefEditorWrapper.cs index 8a5c40e..9ba3369 100644 --- a/src/Editor/SOWrappers/RefEditorWrapper.cs +++ b/src/Editor/SOWrappers/RefEditorWrapper.cs @@ -1,5 +1,6 @@ -#if UNITY_EDITOR + #if UNITY_EDITOR using System; +using System.Runtime.CompilerServices; using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors @@ -12,8 +13,10 @@ namespace DCFApixels.DragonECS.Unity.Editors public override object Data { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return data; } } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RefEditorWrapper Take(object data) { var result = Take(); diff --git a/src/Editor/SOWrappers/UnityObjEditorWrapper.cs b/src/Editor/SOWrappers/UnityObjEditorWrapper.cs index 385c092..fdb96d6 100644 --- a/src/Editor/SOWrappers/UnityObjEditorWrapper.cs +++ b/src/Editor/SOWrappers/UnityObjEditorWrapper.cs @@ -1,5 +1,6 @@ #if UNITY_EDITOR using System; +using System.Runtime.CompilerServices; using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors @@ -12,8 +13,10 @@ namespace DCFApixels.DragonECS.Unity.Editors public override object Data { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return data; } } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static UnityObjEditorWrapper Take(UnityEngine.Object data) { var result = Take(); diff --git a/src/Editor/SOWrappers/WrapperBase.cs b/src/Editor/SOWrappers/WrapperBase.cs index 2901e40..d068d01 100644 --- a/src/Editor/SOWrappers/WrapperBase.cs +++ b/src/Editor/SOWrappers/WrapperBase.cs @@ -1,6 +1,7 @@ #if UNITY_EDITOR using System; using System.Collections.Generic; +using System.Runtime.CompilerServices; using UnityEditor; using UnityEngine; @@ -29,17 +30,22 @@ namespace DCFApixels.DragonECS.Unity.Editors public override bool IsExpanded { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return Property.isExpanded; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] set { Property.isExpanded = value; } } public override SerializedObject SO { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _so; } } public override SerializedProperty Property { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _property; } } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TSelf Take() { TSelf result; @@ -60,6 +66,7 @@ namespace DCFApixels.DragonECS.Unity.Editors result._isReleased = false; return result; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Release(TSelf wrapper) { if (wrapper._isReleased) @@ -75,6 +82,7 @@ namespace DCFApixels.DragonECS.Unity.Editors _isDestroyed = true; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void Release() { Release((TSelf)this); diff --git a/src/EntityTemplate/Editor/EntityTemplateEditor.cs b/src/EntityTemplate/Editor/EntityTemplateEditor.cs index 1ef2a86..5b98b33 100644 --- a/src/EntityTemplate/Editor/EntityTemplateEditor.cs +++ b/src/EntityTemplate/Editor/EntityTemplateEditor.cs @@ -99,11 +99,13 @@ namespace DCFApixels.DragonECS.Unity.Editors return; DrawTop(target); + GUILayout.BeginVertical(EcsEditor.GetStyle(Color.black, 0.2f)); for (int i = 0; i < componentsProp.arraySize; i++) { DrawComponentData(componentsProp.GetArrayElementAtIndex(i), i); GUILayout.Space(EditorGUIUtility.standardVerticalSpacing * 2); } + GUILayout.EndVertical(); DrawFooter(target); } private void DrawTop(ITemplateInternal target) @@ -183,12 +185,12 @@ namespace DCFApixels.DragonECS.Unity.Editors removeButtonRect.center = new Vector2(lastrect.xMax + removeButtonRect.width, lastrect.yMin + removeButtonRect.height / 2f); GUILayout.EndVertical(); - Rect lineRect = GUILayoutUtility.GetLastRect(); - lineRect.y = lineRect.yMax; - lineRect.height = 3f; - Color rectColor = panelColor; - rectColor.a = 0.34f; - EditorGUI.DrawRect(lineRect, rectColor); + //Rect lineRect = GUILayoutUtility.GetLastRect(); + //lineRect.y = lineRect.yMax; + //lineRect.height = 3f; + //Color rectColor = panelColor; + //rectColor.a = 0.34f; + //EditorGUI.DrawRect(lineRect, rectColor); GUILayout.Label("", GUILayout.Width(removeButtonRect.width)); if (GUI.Button(removeButtonRect, "x", removeButtonStyle))