mirror of
https://github.com/DCFApixels/DragonECS-Unity.git
synced 2025-09-18 01:54:35 +08:00
update editor
This commit is contained in:
parent
84445bfb7c
commit
963cd2a286
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
8
src/Editor/SOWrappers.meta
Normal file
8
src/Editor/SOWrappers.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fc9ef2bbe6a95624e9c6d50e19f38a05
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
24
src/Editor/SOWrappers/RefEditorWrapper.cs
Normal file
24
src/Editor/SOWrappers/RefEditorWrapper.cs
Normal 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
|
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9047f4ae8f7a24c4d8b053ffeeb259f7
|
||||
guid: b0f14ae652b89744888db94704a170ef
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
24
src/Editor/SOWrappers/UnityObjEditorWrapper.cs
Normal file
24
src/Editor/SOWrappers/UnityObjEditorWrapper.cs
Normal 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
|
11
src/Editor/SOWrappers/UnityObjEditorWrapper.cs.meta
Normal file
11
src/Editor/SOWrappers/UnityObjEditorWrapper.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7060bf63683c82a4a8a6cf54255c4139
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
73
src/Editor/SOWrappers/WrapperBase.cs
Normal file
73
src/Editor/SOWrappers/WrapperBase.cs
Normal 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
|
11
src/Editor/SOWrappers/WrapperBase.cs.meta
Normal file
11
src/Editor/SOWrappers/WrapperBase.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c0cef58c08259f4bbb78af2fcec4c79
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Reference in New Issue
Block a user