Revert "框架更新"

This reverts commit a2cb248512.
This commit is contained in:
2025-10-29 22:41:19 +08:00
parent a2cb248512
commit 9572cf1955
429 changed files with 38758 additions and 7183 deletions

View File

@@ -0,0 +1,17 @@
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
namespace Fantasy.Entitas.Interface
{
/// <summary>
/// Entity保存到数据库的时候会根据子组件设置分离存储特性分表存储在不同的集合表中
/// </summary>
public interface ISingleCollectionRoot { }
public static class SingleCollectionRootChecker<T> where T : Entity
{
public static bool IsSupported { get; }
static SingleCollectionRootChecker()
{
IsSupported = typeof(ISingleCollectionRoot).IsAssignableFrom(typeof(T));
}
}
}

View File

@@ -0,0 +1,19 @@
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
namespace Fantasy.Entitas.Interface
{
/// <summary>
/// Entity支持数据库
/// </summary>
// ReSharper disable once InconsistentNaming
public interface ISupportedDataBase { }
public static class SupportedDataBaseChecker<T> where T : Entity
{
public static bool IsSupported { get; }
static SupportedDataBaseChecker()
{
IsSupported = typeof(ISupportedDataBase).IsAssignableFrom(typeof(T));
}
}
}

View File

@@ -0,0 +1,20 @@
using System;
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
namespace Fantasy.Entitas.Interface
{
/// <summary>
/// 支持再一个组件里添加多个同类型组件
/// </summary>
public interface ISupportedMultiEntity : IDisposable { }
public static class SupportedMultiEntityChecker<T> where T : Entity
{
public static bool IsSupported { get; }
static SupportedMultiEntityChecker()
{
IsSupported = typeof(ISupportedMultiEntity).IsAssignableFrom(typeof(T));
}
}
}

View File

@@ -0,0 +1,47 @@
using System;
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
namespace Fantasy.Entitas.Interface
{
// Entity是单一集合、保存到数据库的时候不会跟随父组件保存在一个集合里、会单独保存在一个集合里
// 需要配合SingleCollectionAttribute一起使用、如在Entity类头部定义SingleCollectionAttribute(typeOf(Unit))
// SingleCollectionAttribute用来定义这个Entity是属于哪个Entity的子集
/// <summary>
/// 定义实体支持单一集合存储的接口。当实体需要单独存储在一个集合中,并且在保存到数据库时不会与父组件一起保存在同一个集合中时,应实现此接口。
/// </summary>
public interface ISupportedSingleCollection { }
public static class SupportedSingleCollectionChecker<T> where T : Entity
{
public static bool IsSupported { get; }
static SupportedSingleCollectionChecker()
{
IsSupported = typeof(ISupportedSingleCollection).IsAssignableFrom(typeof(T));
}
}
/// <summary>
/// 表示用于指定实体的单一集合存储属性。此属性用于配合 <see cref="ISupportedSingleCollection"/> 接口使用,
/// 用于定义实体属于哪个父实体的子集合,以及在数据库中使用的集合名称。
/// </summary>
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class SingleCollectionAttribute : Attribute
{
/// <summary>
/// 获取父实体的类型,指示此实体是属于哪个父实体的子集合。
/// </summary>
public readonly Type RootType;
/// <summary>
/// 获取在数据库中使用的集合名称。
/// </summary>
public readonly string CollectionName;
/// <summary>
/// 初始化 <see cref="SingleCollectionAttribute"/> 类的新实例,指定父实体类型和集合名称。
/// </summary>
/// <param name="rootType">父实体的类型。</param>
/// <param name="collectionName">在数据库中使用的集合名称。</param>
public SingleCollectionAttribute(Type rootType, string collectionName)
{
RootType = rootType;
CollectionName = collectionName;
}
}
}

View File

@@ -0,0 +1,19 @@
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
#if FANTASY_NET
namespace Fantasy.Entitas.Interface
{
/// <summary>
/// Entity支持传送
/// </summary>
public interface ISupportedTransfer { }
public static class SupportedTransferChecker<T> where T : Entity
{
public static bool IsSupported { get; }
static SupportedTransferChecker()
{
IsSupported = typeof(ISupportedTransfer).IsAssignableFrom(typeof(T));
}
}
}
#endif

View File

@@ -0,0 +1,32 @@
using System;
using Fantasy.Async;
namespace Fantasy.Entitas.Interface
{
internal interface IAwakeSystem : IEntitiesSystem { }
/// <summary>
/// 实体的Awake事件的抽象接口
/// </summary>
/// <typeparam name="T">实体的泛型类型</typeparam>
public abstract class AwakeSystem<T> : IAwakeSystem where T : Entity
{
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
public Type EntitiesType() => typeof(T);
/// <summary>
/// 事件的抽象方法,需要自己实现这个方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
protected abstract void Awake(T self);
/// <summary>
/// 框架内部调用的触发Awake的方法。
/// </summary>
/// <param name="self">触发事件的实体实例</param>
public void Invoke(Entity self)
{
Awake((T) self);
}
}
}

View File

@@ -0,0 +1,59 @@
using System;
namespace Fantasy.Entitas.Interface
{
/// <summary>
/// 自定义组件事件系统接口
/// 如果需要自定义组件事件系统,请继承此接口。
/// 这个接口内部使用。不对外开放。
/// </summary>
internal interface ICustomEntitiesSystem
{
/// <summary>
/// 事件类型
/// 用于触发这个组件事件关键因素。
/// </summary>
int CustomEventType { get; }
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
Type EntitiesType();
/// <summary>
/// 框架内部调用的触发事件方法
/// </summary>
/// <param name="entity"></param>
void Invoke(Entity entity);
}
/// <summary>
/// 自定义组件事件系统抽象类
/// 如果需要自定义组件事件系统,请继承此抽象类。
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class CustomSystem<T> : ICustomEntitiesSystem where T : Entity
{
/// <summary>
/// 这个1表示是一个自定义事件类型执行这个事件是时候需要用到这个1.
/// </summary>
public abstract int CustomEventType { get; }
/// <summary>
/// 事件的抽象方法,需要自己实现这个方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
protected abstract void Custom(T self);
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
public abstract Type EntitiesType();
/// <summary>
/// 框架内部调用的触发Awake的方法。
/// </summary>
/// <param name="self">触发事件的实体实例</param>
public void Invoke(Entity self)
{
Custom((T) self);
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
using Fantasy.Async;
namespace Fantasy.Entitas.Interface
{
internal interface IDeserializeSystem : IEntitiesSystem { }
/// <summary>
/// 实体的反序列化事件的抽象接口
/// </summary>
/// <typeparam name="T">实体的泛型数据</typeparam>
public abstract class DeserializeSystem<T> : IDeserializeSystem where T : Entity
{
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
public Type EntitiesType() => typeof(T);
/// <summary>
/// 事件的抽象方法,需要自己实现这个方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
protected abstract void Deserialize(T self);
/// <summary>
/// 框架内部调用的触发Deserialize的方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
public void Invoke(Entity self)
{
Deserialize((T) self);
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
using Fantasy.Async;
namespace Fantasy.Entitas.Interface
{
internal interface IDestroySystem : IEntitiesSystem { }
/// <summary>
/// 实体销毁事件的抽象接口
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class DestroySystem<T> : IDestroySystem where T : Entity
{
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
public Type EntitiesType() => typeof(T);
/// <summary>
/// 事件的抽象方法,需要自己实现这个方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
protected abstract void Destroy(T self);
/// <summary>
/// 框架内部调用的触发Destroy的方法
/// </summary>
/// <param name="self"></param>
public void Invoke(Entity self)
{
Destroy((T) self);
}
}
}

View File

@@ -0,0 +1,22 @@
using System;
using Fantasy.Async;
namespace Fantasy.Entitas.Interface
{
/// <summary>
/// ECS事件系统的核心接口任何事件都是要继承这个接口
/// </summary>
public interface IEntitiesSystem
{
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
Type EntitiesType();
/// <summary>
/// 框架内部调用的触发事件方法
/// </summary>
/// <param name="entity"></param>
void Invoke(Entity entity);
}
}

View File

@@ -0,0 +1,31 @@
using System;
namespace Fantasy.Entitas.Interface
{
internal interface IFrameUpdateSystem : IEntitiesSystem { }
/// <summary>
/// 帧更新时间的抽象接口
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class FrameUpdateSystem<T> : IFrameUpdateSystem where T : Entity
{
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
public Type EntitiesType() => typeof(T);
/// <summary>
/// 事件的抽象方法,需要自己实现这个方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
protected abstract void FrameUpdate(T self);
/// <summary>
/// 框架内部调用的触发FrameUpdate的方法
/// </summary>
/// <param name="self"></param>
public void Invoke(Entity self)
{
FrameUpdate((T) self);
}
}
}

View File

@@ -0,0 +1,31 @@
using System;
namespace Fantasy.Entitas.Interface
{
internal interface IUpdateSystem : IEntitiesSystem { }
/// <summary>
/// Update事件的抽象接口
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class UpdateSystem<T> : IUpdateSystem where T : Entity
{
/// <summary>
/// 实体的类型
/// </summary>
/// <returns></returns>
public Type EntitiesType() => typeof(T);
/// <summary>
/// 事件的抽象方法,需要自己实现这个方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
protected abstract void Update(T self);
/// <summary>
/// 框架内部调用的触发Update的方法
/// </summary>
/// <param name="self">触发事件的实体实例</param>
public void Invoke(Entity self)
{
Update((T) self);
}
}
}