mirror of
https://github.com/DCFApixels/DragonECS-Unity.git
synced 2025-09-18 10:04:36 +08:00
update editor
This commit is contained in:
parent
84445bfb7c
commit
963cd2a286
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
fileFormatVersion: 2
|
||||||
guid: 9047f4ae8f7a24c4d8b053ffeeb259f7
|
guid: b0f14ae652b89744888db94704a170ef
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
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