This commit is contained in:
Mikhail 2024-03-06 23:29:54 +08:00
parent 3701423bf6
commit 6e718691cd
3 changed files with 64 additions and 51 deletions

View File

@ -5,6 +5,13 @@ using UnityEngine;
namespace DCFApixels.DragonECS
{
internal static class UnityComponentConsts
{
private const string UNITY_COMPONENT_NAME = "UnityComponent";
public static readonly MetaGroup BaseGroup = new MetaGroupRef(UNITY_COMPONENT_NAME);
public static readonly MetaGroup ColliderGroup = new MetaGroupRef($"{UNITY_COMPONENT_NAME}/Collider/");
public static readonly MetaGroup JointGroup = new MetaGroupRef($"{UNITY_COMPONENT_NAME}/Joint/");
}
[Serializable]
[MetaColor(255 / 3, 255, 0)]
public struct UnityComponent<T> : IEcsComponent, IEnumerable<T>//IntelliSense hack
@ -22,7 +29,14 @@ namespace DCFApixels.DragonECS
#region Unity Component Templates
public class UnityComponentTemplate<T> : ComponentTemplateBase<UnityComponent<T>> where T : Component
{
public override string Name => "UnityComponent/" + typeof(T).Name;
public override string Name
{
get { return typeof(T).Name; }
}
public override MetaGroup Group
{
get { return UnityComponentConsts.BaseGroup; }
}
public sealed override void Apply(int worldID, int entityID)
{
EcsWorld.GetPool<EcsPool<UnityComponent<T>>>(worldID).TryAddOrGet(entityID) = component;
@ -51,27 +65,27 @@ namespace DCFApixels.DragonECS
[Serializable]
public sealed class UnityComponentColliderTemplate : UnityComponentTemplate<Collider>
{
public override string Name => "UnityComponent/Collider/" + nameof(Collider);
public override MetaGroup Group { get { return UnityComponentConsts.ColliderGroup; } }
}
[Serializable]
public sealed class UnityComponentBoxColliderTemplate : UnityComponentTemplate<BoxCollider>
{
public override string Name => "UnityComponent/Collider/" + nameof(BoxCollider);
public override MetaGroup Group { get { return UnityComponentConsts.ColliderGroup; } }
}
[Serializable]
public sealed class UnityComponentSphereColliderTemplate : UnityComponentTemplate<SphereCollider>
{
public override string Name => "UnityComponent/Collider/" + nameof(SphereCollider);
public override MetaGroup Group { get { return UnityComponentConsts.ColliderGroup; } }
}
[Serializable]
public sealed class UnityComponentCapsuleColliderTemplate : UnityComponentTemplate<CapsuleCollider>
{
public override string Name => "UnityComponent/Collider/" + nameof(CapsuleCollider);
public override MetaGroup Group { get { return UnityComponentConsts.ColliderGroup; } }
}
[Serializable]
public sealed class UnityComponentMeshColliderTemplate : UnityComponentTemplate<MeshCollider>
{
public override string Name => "UnityComponent/Collider/" + nameof(MeshCollider);
public override MetaGroup Group { get { return UnityComponentConsts.ColliderGroup; } }
}
#endregion
@ -79,22 +93,22 @@ namespace DCFApixels.DragonECS
[Serializable]
public sealed class UnityComponentJointTemplate : UnityComponentTemplate<Joint>
{
public override string Name => "UnityComponent/Joint/" + nameof(Joint);
public override MetaGroup Group { get { return UnityComponentConsts.JointGroup; } }
}
[Serializable]
public sealed class UnityComponentFixedJointTemplate : UnityComponentTemplate<FixedJoint>
{
public override string Name => "UnityComponent/Joint/" + nameof(FixedJoint);
public override MetaGroup Group { get { return UnityComponentConsts.JointGroup; } }
}
[Serializable]
public sealed class UnityComponentCharacterJointTemplate : UnityComponentTemplate<CharacterJoint>
{
public override string Name => "UnityComponent/Joint/" + nameof(CharacterJoint);
public override MetaGroup Group { get { return UnityComponentConsts.JointGroup; } }
}
[Serializable]
public sealed class UnityComponentConfigurableJointTemplate : UnityComponentTemplate<ConfigurableJoint>
{
public override string Name => "UnityComponent/Joint/" + nameof(ConfigurableJoint);
public override MetaGroup Group { get { return UnityComponentConsts.JointGroup; } }
}
#endregion
}

View File

@ -42,11 +42,19 @@ namespace DCFApixels.DragonECS.Unity.Editors
genericMenu = new GenericMenu();
var dummies = ComponentTemplateTypeCache.Dummies;
foreach (var dummy in dummies)
var componentTemplateDummies = ComponentTemplateTypeCache.Dummies;
foreach (var dummy in componentTemplateDummies)
{
string name = dummy.Name;
string description = dummy.Description;
ITypeMeta meta = dummy is ITypeMeta metaOverride ? metaOverride : dummy.Type.ToMeta();
string name = meta.Name;
string description = meta.Description;
MetaGroup group = meta.Group;
if(group.Name.Length > 0)
{
name = group.Name + name;
}
if (string.IsNullOrEmpty(description) == false)
{
name = $"{name} {EcsUnityConsts.INFO_MARK}";
@ -157,9 +165,10 @@ namespace DCFApixels.DragonECS.Unity.Editors
componentType = componentProperty.managedReferenceValue.GetType(); ;
}
string name = template.Name;
string description = template.Description;
Color panelColor = template.Color.Desaturate(EscEditorConsts.COMPONENT_DRAWER_DESATURATE);
ITypeMeta meta = template is ITypeMeta metaOverride ? metaOverride : template.Type.ToMeta();
string name = meta.Name;
string description = meta.Description;
Color panelColor = meta.Color.ToUnityColor().Desaturate(EscEditorConsts.COMPONENT_DRAWER_DESATURATE);
Rect removeButtonRect = GUILayoutUtility.GetLastRect();
@ -231,19 +240,6 @@ namespace DCFApixels.DragonECS.Unity.Editors
GUILayout.EndHorizontal();
}
public string GetLastPathComponent(string input)
{
int lastSlashIndex = input.LastIndexOfAny(new char[] { '/', '\\' });
if (lastSlashIndex == -1)
{
return input;
}
else
{
return input.Substring(lastSlashIndex + 1);
}
}
}
[CustomEditor(typeof(ScriptableEntityTemplate), true)]

View File

@ -1,4 +1,5 @@
using System;
using Codice.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@ -11,11 +12,6 @@ namespace DCFApixels.DragonECS
{
#region Properties
Type Type { get; }
string Name { get; }
MetaGroup Group { get; }
string Description { get; }
IReadOnlyCollection<string> Tags { get; }
Color Color { get; }
#endregion
#region Methods
@ -31,17 +27,18 @@ namespace DCFApixels.DragonECS
Selected
}
}
public interface IComponentTemplateWithMetaOverride : IComponentTemplate, ITypeMeta { }
[Serializable]
public abstract class ComponentTemplateBase : IComponentTemplate
public abstract class ComponentTemplateBase : IComponentTemplateWithMetaOverride
{
#region Properties
public abstract Type Type { get; }
public virtual string Name { get { return string.Empty; } }
public virtual MetaGroup Group { get { return default; } }
public virtual MetaColor Color { get { return new MetaColor(MetaColor.Black); } }
public virtual MetaGroup Group { get { return MetaGroup.Empty; } }
public virtual string Description { get { return string.Empty; } }
public virtual IReadOnlyCollection<string> Tags { get { return Array.Empty<string>(); } }
public virtual Color Color { get { return Color.black; } }
#endregion
#region Methods
@ -54,19 +51,19 @@ namespace DCFApixels.DragonECS
#endregion
}
[Serializable]
public abstract class ComponentTemplateBase<T> : ComponentTemplateBase, IComponentTemplate
public abstract class ComponentTemplateBase<T> : ComponentTemplateBase
{
private static TypeMeta _meta = EcsDebugUtility.GetTypeMeta<T>();
protected static TypeMeta Meta = EcsDebugUtility.GetTypeMeta<T>();
[SerializeField]
protected T component;
#region Properties
public override Type Type { get { return typeof(T); } }
public override string Name { get { return _meta.Name; } }
public override MetaGroup Group { get { return _meta.Group; } }
public override string Description { get { return _meta.Description; } }
public override IReadOnlyCollection<string> Tags { get { return _meta.Tags; } }
public override Color Color { get { return _meta.Color.ToUnityColor(); } }
public override string Name { get { return Meta.Name; } }
public override MetaGroup Group { get { return Meta.Group; } }
public override string Description { get { return Meta.Description; } }
public override IReadOnlyCollection<string> Tags { get { return Meta.Tags; } }
public override MetaColor Color { get { return Meta.Color; } }
#endregion
#region Methods
@ -81,7 +78,7 @@ namespace DCFApixels.DragonECS
#endregion
}
public abstract class ComponentTemplate<T> : ComponentTemplateBase<T>, IComponentTemplate
public abstract class ComponentTemplate<T> : ComponentTemplateBase<T>
where T : struct, IEcsComponent
{
public override void Apply(int worldID, int entityID)
@ -89,7 +86,7 @@ namespace DCFApixels.DragonECS
EcsWorld.GetPool<EcsPool<T>>(worldID).TryAddOrGet(entityID) = component;
}
}
public abstract class TagComponentTemplate<T> : ComponentTemplateBase<T>, IComponentTemplate
public abstract class TagComponentTemplate<T> : ComponentTemplateBase<T>
where T : struct, IEcsTagComponent
{
public override void Apply(int worldID, int entityID)
@ -118,8 +115,14 @@ namespace DCFApixels.DragonECS.Unity.Editors
{
private static Type[] _types;
private static IComponentTemplate[] _dummies;
internal static ReadOnlySpan<Type> Types => _types;
internal static ReadOnlySpan<IComponentTemplate> Dummies => _dummies;
internal static ReadOnlySpan<Type> Types
{
get { return _types; }
}
internal static ReadOnlySpan<IComponentTemplate> Dummies
{
get { return _dummies; }
}
static ComponentTemplateTypeCache()
{