Entitas
This commit is contained in:
ALEXTANG
2023-07-17 15:28:27 +08:00
parent 31d4d6c0b8
commit a273e9d5f8
64 changed files with 994 additions and 13 deletions

View File

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

View File

@@ -0,0 +1,102 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using Sirenix.OdinInspector.Editor;
using TEngine;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(ComponentView))]
public class ComponentViewEditor : OdinEditor
{
public override void OnInspectorGUI()
{
ComponentView componentView = (ComponentView)target;
Entity component = componentView.Component;
ComponentViewHelper.Draw(component);
}
}
public static class ComponentViewHelper
{
private static readonly List<ITypeDrawer> typeDrawers = new List<ITypeDrawer>();
static ComponentViewHelper()
{
Assembly assembly = typeof(ComponentViewHelper).Assembly;
foreach (Type type in assembly.GetTypes())
{
if (!type.IsDefined(typeof(TypeDrawerAttribute)))
{
continue;
}
ITypeDrawer iTypeDrawer = (ITypeDrawer)Activator.CreateInstance(type);
typeDrawers.Add(iTypeDrawer);
}
}
public static void Draw(Entity entity)
{
try
{
FieldInfo[] fields = entity.GetType()
.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.FlattenHierarchy);
EditorGUILayout.BeginVertical();
EditorGUILayout.LongField("RuntimeId: ", entity.RuntimeId);
EditorGUILayout.LongField("Id: ", entity.Id);
foreach (FieldInfo fieldInfo in fields)
{
Type type = fieldInfo.FieldType;
if (type.IsDefined(typeof(HideInInspector), false))
{
continue;
}
if (fieldInfo.IsDefined(typeof(HideInInspector), false))
{
continue;
}
object value = fieldInfo.GetValue(entity);
foreach (ITypeDrawer typeDrawer in typeDrawers)
{
if (!typeDrawer.HandlesType(type))
{
continue;
}
string fieldName = fieldInfo.Name;
if (fieldName.Length > 17 && fieldName.Contains("k__BackingField"))
{
fieldName = fieldName.Substring(1, fieldName.Length - 17);
}
try
{
value = typeDrawer.DrawAndGetNewValue(type, fieldName, value, null);
}
catch (Exception e)
{
Debug.LogError(e);
}
fieldInfo.SetValue(entity, value);
break;
}
}
EditorGUILayout.EndVertical();
}
catch (Exception e)
{
Debug.Log($"component view error: {entity.GetType().FullName} {e}");
}
}
}

View File

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

View File

@@ -0,0 +1,11 @@
using System;
namespace TEngine
{
public interface ITypeDrawer
{
bool HandlesType(Type type);
object DrawAndGetNewValue(Type memberType, string memberName, object value, object target);
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ba82988cd3f6426cbb858d18eed4a8bb
timeCreated: 1689578308

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 965c500db0aa46ac9a6ff0fe19a9adda
timeCreated: 1689578308

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class AnimationCurveTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (AnimationCurve);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.CurveField(memberName, (AnimationCurve) value);
}
}
}

View File

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

View File

@@ -0,0 +1,19 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class BoolTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (bool);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.Toggle(memberName, (bool) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class BoundsTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Bounds);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.BoundsField(memberName, (Bounds) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class CharTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (char);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
var str = EditorGUILayout.TextField(memberName, ((char) value).ToString());
return str.Length > 0? str[0] : default (char);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class ColorTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Color);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.ColorField(memberName, (Color) value);
}
}
}

View File

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

View File

@@ -0,0 +1,25 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class DateTimeTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (DateTime);
}
// Note: This is a very basic implementation. The ToString() method conversion will cut off milliseconds.
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
var dateString = value.ToString();
var newDateString = EditorGUILayout.TextField(memberName, dateString);
return newDateString != dateString
? DateTime.Parse(newDateString)
: value;
}
}
}

View File

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

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class DictionaryIntLongTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Dictionary<int, long>);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
Dictionary<int, long> dictionary = value as Dictionary<int, long>;
EditorGUILayout.LabelField($"{memberName}:");
foreach ((int k, long v) in dictionary)
{
if (v == 0)
{
continue;
}
EditorGUILayout.LongField($" {k} :", v);
}
return value;
}
}
}

View File

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

View File

@@ -0,0 +1,19 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class DoubleTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (double);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.DoubleField(memberName, (double) value);
}
}
}

View File

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

View File

@@ -0,0 +1,39 @@
#if ENABLE_VIEW
using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class EntityRefTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
if (!type.IsGenericType)
{
return false;
}
if (type.GetGenericTypeDefinition() == typeof (EntityRef<>))
{
return true;
}
return false;
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
FieldInfo fieldInfo = memberType.GetField("entity", BindingFlags.NonPublic | BindingFlags.Instance);
Entity entity = (Entity)fieldInfo.GetValue(value);
GameObject go = entity?.ViewGO;
EditorGUILayout.ObjectField(memberName, go, memberType, true);
return value;
}
}
}
#endif

View File

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

View File

@@ -0,0 +1,24 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class EnumTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type.IsEnum;
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
if (memberType.IsDefined(typeof (FlagsAttribute), false))
{
return EditorGUILayout.EnumFlagsField(memberName, (Enum) value);
}
return EditorGUILayout.EnumPopup(memberName, (Enum) value);
}
}
}

View File

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

View File

@@ -0,0 +1,19 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class FloatTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (float);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.FloatField(memberName, (float) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class IntTypeDrawer: ITypeDrawer
{
[TypeDrawer]
public bool HandlesType(Type type)
{
return type == typeof (int);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.IntField(memberName, (int) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class LongTypeDrawer: ITypeDrawer
{
[TypeDrawer]
public bool HandlesType(Type type)
{
return type == typeof (long);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.LongField(memberName, (long) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class RectTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Rect);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.RectField(memberName, (Rect) value);
}
}
}

View File

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

View File

@@ -0,0 +1,19 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class StringTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (string);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.DelayedTextField(memberName, (string) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
namespace TEngine
{
[TypeDrawer]
public class UnityObjectTypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (UnityEngine.Object) ||
type.IsSubclassOf(typeof (UnityEngine.Object));
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.ObjectField(memberName, (UnityEngine.Object) value, memberType, true);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class Vector2TypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Vector2);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.Vector2Field(memberName, (Vector2) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class Vector3TypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Vector3);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.Vector3Field(memberName, (Vector3) value);
}
}
}

View File

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

View File

@@ -0,0 +1,20 @@
using System;
using UnityEditor;
using UnityEngine;
namespace TEngine
{
[TypeDrawer]
public class Vector4TypeDrawer: ITypeDrawer
{
public bool HandlesType(Type type)
{
return type == typeof (Vector4);
}
public object DrawAndGetNewValue(Type memberType, string memberName, object value, object target)
{
return EditorGUILayout.Vector4Field(memberName, (Vector4) value);
}
}
}

View File

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

View File

@@ -0,0 +1,6 @@
using System;
namespace TEngine
{
public class TypeDrawerAttribute: Attribute { }
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 64d93f1343d249ea98a11ad1dfe9dc7d
timeCreated: 1689578308