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 else
{ {
//Color defColor = GUI.contentColor;
//Color c = defColor;
//c.a = 0.55f;
//GUI.contentColor = c;
GUI.enabled = false; GUI.enabled = false;
EditorGUI.TextField(idRect, "Entity ID"); EditorGUI.TextField(idRect, "Entity ID");
EditorGUI.TextField(genRect, "Gen"); EditorGUI.TextField(genRect, "Gen");
EditorGUI.TextField(worldRect, "World ID"); EditorGUI.TextField(worldRect, "World ID");
GUI.enabled = true; GUI.enabled = true;
//GUI.contentColor = defColor;
} }
} }

View File

@ -1,67 +1,64 @@
#if UNITY_EDITOR #if UNITY_EDITOR
using DCFApixels.DragonECS.Unity.Internal; using DCFApixels.DragonECS.Unity.Internal;
using System; using System;
using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors namespace DCFApixels.DragonECS.Unity.Editors
{ {
internal class WrapperBase<TSelf> : ScriptableObject internal static class EcsUnityEditorUtility
where TSelf : WrapperBase<TSelf>
{ {
private SerializedObject _so; public static string TransformFieldName(string name)
private SerializedProperty _property;
private bool _isReleased = false;
private static Stack<TSelf> _wrappers = new Stack<TSelf>();
public SerializedObject SO
{ {
get { return _so; } if (name.Length <= 0)
}
public SerializedProperty Property
{
get { return _property; }
}
public static TSelf Take()
{
TSelf result;
if (_wrappers.Count <= 0)
{ {
result = CreateInstance<TSelf>(); return name;
result._so = new SerializedObject(result);
result._property = result._so.FindProperty("data");
} }
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;
} return b.ToString();
public static void Release(TSelf wrapper)
{
if (wrapper._isReleased)
{
return;
}
wrapper._isReleased = true;
_wrappers.Push(wrapper);
} }
} }
internal class RefEditorWrapper : WrapperBase<RefEditorWrapper>
{
[SerializeReference]
public object data;
}
internal class UnityObjEditorWrapper : WrapperBase<UnityObjEditorWrapper>
{
[SerializeField]
public UnityEngine.Object data;
}
public static class EcsGUI public static class EcsGUI
{ {
@ -177,7 +174,7 @@ namespace DCFApixels.DragonECS.Unity.Editors
GUILayout.BeginVertical(EcsEditor.GetStyle(panelColor, 0.22f)); GUILayout.BeginVertical(EcsEditor.GetStyle(panelColor, 0.22f));
EditorGUI.BeginChangeCheck(); 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) if (changed)
{ {
@ -196,64 +193,59 @@ namespace DCFApixels.DragonECS.Unity.Editors
GUILayout.Space(2f); 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(); Type type = data.GetType();
var uobj = data as UnityEngine.Object; var uobj = data as UnityEngine.Object;
if (uobj == false && type.IsGenericType)
if ((uobj == false && type.IsGenericType) ||
(uobj == false && !type.IsSerializable))
{ {
bool result = false; 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); GUIContent subLabel = new GUIContent(EcsUnityEditorUtility.TransformFieldName(field.Name));
result = true; if (DrawData(field.FieldType, subLabel, field.GetValue(data), out object fieldData))
{
field.SetValue(data, fieldData);
result = true;
}
} }
EditorGUI.indentLevel--;
} }
w.Release();
outData = data; outData = data;
return result; return result;
} }
else else
{ {
EditorGUI.BeginChangeCheck();
WrapperBase w;
if (uobj == null) if (uobj == null)
{ {
EditorGUI.BeginChangeCheck(); w = RefEditorWrapper.Take(data);
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;
}
} }
else else
{ {
EditorGUI.BeginChangeCheck(); w = UnityObjEditorWrapper.Take(uobj);
}
w.SO.Update();
var w = UnityObjEditorWrapper.Take(); EditorGUILayout.PropertyField(w.Property, label, true);
w.data = uobj; w.Release();
w.SO.Update();
EditorGUILayout.PropertyField(w.Property, true); if (EditorGUI.EndChangeCheck())
UnityObjEditorWrapper.Release(w); {
w.SO.ApplyModifiedProperties();
if (EditorGUI.EndChangeCheck()) outData = w.Data;
{ return true;
w.SO.ApplyModifiedProperties();
outData = uobj;
return true;
}
} }
outData = data; 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 fileFormatVersion: 2
guid: 9047f4ae8f7a24c4d8b053ffeeb259f7 guid: b0f14ae652b89744888db94704a170ef
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 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: