update editor

This commit is contained in:
Mikhail 2024-03-03 22:46:26 +08:00
parent 84445bfb7c
commit 963cd2a286
10 changed files with 231 additions and 118 deletions

View File

@ -178,16 +178,11 @@ namespace DCFApixels.DragonECS.Unity.Editors
}
else
{
//Color defColor = GUI.contentColor;
//Color c = defColor;
//c.a = 0.55f;
//GUI.contentColor = c;
GUI.enabled = false;
EditorGUI.TextField(idRect, "Entity ID");
EditorGUI.TextField(genRect, "Gen");
EditorGUI.TextField(worldRect, "World ID");
EditorGUI.TextField(idRect, "Entity ID");
EditorGUI.TextField(genRect, "Gen");
EditorGUI.TextField(worldRect, "World ID");
GUI.enabled = true;
//GUI.contentColor = defColor;
}
}

View File

@ -1,67 +1,64 @@
#if UNITY_EDITOR
using DCFApixels.DragonECS.Unity.Internal;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors
{
internal class WrapperBase<TSelf> : ScriptableObject
where TSelf : WrapperBase<TSelf>
internal static class EcsUnityEditorUtility
{
private SerializedObject _so;
private SerializedProperty _property;
private bool _isReleased = false;
private static Stack<TSelf> _wrappers = new Stack<TSelf>();
public SerializedObject SO
public static string TransformFieldName(string name)
{
get { return _so; }
}
public SerializedProperty Property
{
get { return _property; }
}
public static TSelf Take()
{
TSelf result;
if (_wrappers.Count <= 0)
if (name.Length <= 0)
{
result = CreateInstance<TSelf>();
result._so = new SerializedObject(result);
result._property = result._so.FindProperty("data");
return name;
}
else
StringBuilder b = new StringBuilder();
bool nextWorld = true;
bool prewIsUpper = false;
for (int i = 0; i < name.Length; i++)
{
result = _wrappers.Pop();
char c = name[i];
if (char.IsLetter(c) == false)
{
nextWorld = true;
prewIsUpper = false;
continue;
}
bool isUpper = char.IsUpper(c);
if (isUpper)
{
if (nextWorld == false && prewIsUpper == false)
{
b.Append(' ');
}
}
else
{
if (nextWorld)
{
b.Append(char.ToUpper(c));
}
else
{
b.Append(c);
}
nextWorld = false;
}
prewIsUpper = isUpper;
}
return result;
}
public static void Release(TSelf wrapper)
{
if (wrapper._isReleased)
{
return;
}
wrapper._isReleased = true;
_wrappers.Push(wrapper);
return b.ToString();
}
}
internal class RefEditorWrapper : WrapperBase<RefEditorWrapper>
{
[SerializeReference]
public object data;
}
internal class UnityObjEditorWrapper : WrapperBase<UnityObjEditorWrapper>
{
[SerializeField]
public UnityEngine.Object data;
}
public static class EcsGUI
{
@ -177,7 +174,7 @@ namespace DCFApixels.DragonECS.Unity.Editors
GUILayout.BeginVertical(EcsEditor.GetStyle(panelColor, 0.22f));
EditorGUI.BeginChangeCheck();
bool changed = DrawData(pool.ComponentType, data, out object resultData);
bool changed = DrawData(pool.ComponentType, new GUIContent(meta.Name), data, out object resultData);
if (changed)
{
@ -196,64 +193,59 @@ namespace DCFApixels.DragonECS.Unity.Editors
GUILayout.Space(2f);
}
private static bool DrawData(Type fieldType, object data, out object outData)
private static bool DrawData(Type fieldType, GUIContent label, object data, out object outData)
{
var meta = data.GetMeta();
GUIContent label = new GUIContent(meta.Name);
Type type = data.GetType();
var uobj = data as UnityEngine.Object;
if (uobj == false && type.IsGenericType)
if ((uobj == false && type.IsGenericType) ||
(uobj == false && !type.IsSerializable))
{
bool result = false;
foreach (var field in type.GetFields(fieldFlags))
WrapperBase w = RefEditorWrapper.Take(EmptyDummy.Instance);
//w.SO.Update();
//EditorGUILayout.PropertyField(w.Property, label, true);
w.Property.isExpanded = EditorGUILayout.Foldout(w.Property.isExpanded, label);
if (w.Property.isExpanded)
{
if (DrawData(field.FieldType, field.GetValue(data), out object fieldData))
EditorGUI.indentLevel++;
foreach (var field in type.GetFields(fieldFlags))
{
field.SetValue(data, fieldData);
result = true;
GUIContent subLabel = new GUIContent(EcsUnityEditorUtility.TransformFieldName(field.Name));
if (DrawData(field.FieldType, subLabel, field.GetValue(data), out object fieldData))
{
field.SetValue(data, fieldData);
result = true;
}
}
EditorGUI.indentLevel--;
}
w.Release();
outData = data;
return result;
}
else
{
EditorGUI.BeginChangeCheck();
WrapperBase w;
if (uobj == null)
{
EditorGUI.BeginChangeCheck();
var w = RefEditorWrapper.Take();
w.data = data;
w.SO.Update();
EditorGUILayout.PropertyField(w.Property, true);
RefEditorWrapper.Release(w);
if (EditorGUI.EndChangeCheck())
{
w.SO.ApplyModifiedProperties();
outData = w.data;
return true;
}
w = RefEditorWrapper.Take(data);
}
else
{
EditorGUI.BeginChangeCheck();
w = UnityObjEditorWrapper.Take(uobj);
}
w.SO.Update();
var w = UnityObjEditorWrapper.Take();
w.data = uobj;
w.SO.Update();
EditorGUILayout.PropertyField(w.Property, label, true);
w.Release();
EditorGUILayout.PropertyField(w.Property, true);
UnityObjEditorWrapper.Release(w);
if (EditorGUI.EndChangeCheck())
{
w.SO.ApplyModifiedProperties();
outData = uobj;
return true;
}
if (EditorGUI.EndChangeCheck())
{
w.SO.ApplyModifiedProperties();
outData = w.Data;
return true;
}
outData = data;

View File

@ -1,25 +0,0 @@
using System;
using System.Reflection;
namespace DCFApixels.DragonECS.Unity.Editors
{
public struct FieldDrawerInfo
{
private static readonly BindingFlags fieldFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
public Type type;
public object data;
public FieldInfo[] fields;
public FieldDrawerInfo(object data)
{
type = data.GetType();
this.data = data;
fields = type.GetFields(fieldFlags);
}
public void Set(object data)
{
type = data.GetType();
this.data = data;
fields = type.GetFields(fieldFlags);
}
}
}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fc9ef2bbe6a95624e9c6d50e19f38a05
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,24 @@
#if UNITY_EDITOR
using System;
using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors
{
[Serializable]
internal class RefEditorWrapper : WrapperBase<RefEditorWrapper>
{
[SerializeReference]
public object data;
public override object Data
{
get { return data; }
}
public static RefEditorWrapper Take(object data)
{
var result = Take();
result.data = data;
return result;
}
}
}
#endif

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 9047f4ae8f7a24c4d8b053ffeeb259f7
guid: b0f14ae652b89744888db94704a170ef
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,24 @@
#if UNITY_EDITOR
using System;
using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors
{
[Serializable]
internal class UnityObjEditorWrapper : WrapperBase<UnityObjEditorWrapper>
{
[SerializeField]
public UnityEngine.Object data;
public override object Data
{
get { return data; }
}
public static UnityObjEditorWrapper Take(UnityEngine.Object data)
{
var result = Take();
result.data = data;
return result;
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7060bf63683c82a4a8a6cf54255c4139
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,73 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors
{
[Serializable]
internal abstract class WrapperBase : ScriptableObject
{
public abstract object Data { get; }
public abstract SerializedObject SO { get; }
public abstract SerializedProperty Property { get; }
public abstract void Release();
}
[Serializable]
internal abstract class WrapperBase<TSelf> : WrapperBase
where TSelf : WrapperBase<TSelf>
{
private SerializedObject _so;
private SerializedProperty _property;
private bool _isReleased = false;
private static Stack<TSelf> _wrappers = new Stack<TSelf>();
public override SerializedObject SO
{
get { return _so; }
}
public override SerializedProperty Property
{
get { return _property; }
}
public static TSelf Take()
{
TSelf result;
if (_wrappers.Count <= 0)
{
result = CreateInstance<TSelf>();
result._so = new SerializedObject(result);
result._property = result._so.FindProperty("data");
}
else
{
result = _wrappers.Pop();
}
return result;
}
public static void Release(TSelf wrapper)
{
if (wrapper._isReleased)
{
return;
}
wrapper._isReleased = true;
_wrappers.Push(wrapper);
}
public override void Release()
{
Release((TSelf)this);
}
}
[Serializable]
public class EmptyDummy
{
public static readonly EmptyDummy Instance = new EmptyDummy();
private EmptyDummy() { }
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6c0cef58c08259f4bbb78af2fcec4c79
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: