Files
BITKit/Src/Core/ECS/EntityComponentSystem.cs

154 lines
5.6 KiB
C#
Raw Normal View History

2023-06-29 14:57:11 +08:00
using System.Threading;
2023-08-11 23:57:37 +08:00
using System;
2025-03-09 13:38:23 +08:00
using System.Collections.Generic;
2023-10-06 23:43:19 +08:00
using System.ComponentModel.Design;
2024-11-03 16:38:17 +08:00
using Microsoft.Extensions.DependencyInjection;
2023-10-06 23:43:19 +08:00
#if NET5_0_OR_GREATER
using Microsoft.Extensions.DependencyInjection;
#endif
2023-11-06 01:17:23 +08:00
namespace BITKit.Entities
2023-06-29 14:57:11 +08:00
{
/// <summary>
/// 基本实体
/// </summary>
public interface IEntity
{
2024-05-31 01:23:15 +08:00
int Id { get; }
2023-10-06 23:43:19 +08:00
CancellationToken CancellationToken { get; }
IServiceProvider ServiceProvider { get; }
2023-11-06 01:17:23 +08:00
IServiceCollection ServiceCollection { get; }
2023-10-24 23:38:22 +08:00
void Inject(object obj);
2025-03-24 14:42:40 +08:00
2023-06-29 14:57:11 +08:00
}
/// <summary>
/// 基本实体服务
/// </summary>
public interface IEntitiesService
{
2023-08-11 23:57:37 +08:00
/// <summary>
/// 当添加Entity时
/// </summary>
public event Action<IEntity> OnAdd;
/// <summary>
/// 当移除Entity时
/// </summary>
public event Action<IEntity> OnRemove;
2023-06-29 14:57:11 +08:00
/// <summary>
/// 所有Entity
/// </summary>
2025-03-09 13:38:23 +08:00
IReadOnlyDictionary<int,IEntity> Entities { get; }
2023-06-29 14:57:11 +08:00
/// <summary>
/// 注册Entity
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
bool Register(IEntity entity);
/// <summary>
/// 注销Entity
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
bool UnRegister(IEntity entity);
CancellationToken CancellationToken { get; }
2023-08-11 23:57:37 +08:00
/// <summary>
/// 通过Id获取Entity
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
2024-05-31 01:23:15 +08:00
IEntity Get(int id);
2024-03-31 23:31:00 +08:00
/// <summary>
/// 尝试通过Id获取Entity
/// </summary>
/// <param name="id"></param>
/// <param name="entity"></param>
/// <returns></returns>
2024-05-31 01:23:15 +08:00
bool TryGetEntity(int id, out IEntity entity);
2024-03-31 23:31:00 +08:00
/// <summary>
/// 通过Id获取或添加Entity
/// </summary>
2024-05-31 01:23:15 +08:00
IEntity GetOrAdd(int id,Func<int,IEntity> factory);
2025-03-24 14:42:40 +08:00
2023-08-11 23:57:37 +08:00
/// <summary>
/// 查询1个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<T> QueryComponents<T>() where T : class;
2023-10-06 23:43:19 +08:00
2023-08-11 23:57:37 +08:00
/// <summary>
/// 查询2个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<ValueTuple<T, T1>> QueryComponents<T, T1>() where T : class where T1 : class;
2023-10-06 23:43:19 +08:00
2023-08-11 23:57:37 +08:00
/// <summary>
/// 查询3个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<ValueTuple<T, T1, T2>> QueryComponents<T, T1, T2>() where T : class where T1 : class where T2 : class;
2023-10-06 23:43:19 +08:00
2024-06-22 17:58:05 +08:00
/// <summary>
/// 查询4个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<ValueTuple<T, T1, T2, T3>> QueryComponents<T, T1, T2, T3>() where T : class where T1 : class where T2 : class where T3:class;
2024-06-22 17:58:05 +08:00
/// <summary>
/// 查询5个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <typeparam name="T4"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<ValueTuple<T, T1, T2, T3, T4>> QueryComponents<T, T1, T2, T3, T4>()where T : class where T1 : class where T2 : class where T3:class where T4:class;
2024-06-22 17:58:05 +08:00
/// <summary>
/// 查询6个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <typeparam name="T4"></typeparam>
/// <typeparam name="T5"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<ValueTuple<T, T1, T2, T3, T4, T5>> QueryComponents<T, T1, T2, T3, T4, T5>()where T : class where T1 : class where T2 : class where T3:class where T4:class where T5 : class;
2024-06-22 17:58:05 +08:00
/// <summary>
/// 查询7个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <typeparam name="T4"></typeparam>
/// <typeparam name="T5"></typeparam>
/// <typeparam name="T6"></typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
Span<ValueTuple<T, T1, T2, T3, T4, T5, T6>> QueryComponents<T, T1, T2, T3, T4, T5, T6>()where T : class where T1 : class where T2 : class where T3:class where T4:class where T5 : class where T6 :class;
2024-06-22 17:58:05 +08:00
/// <summary>
/// 查询8个组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <typeparam name="T4"></typeparam>
/// <typeparam name="T5"></typeparam>
/// <typeparam name="T6"></typeparam>
/// <typeparam name="TRest">剩余实例</typeparam>
/// <returns></returns>
2025-03-24 14:42:40 +08:00
//Span<ValueTuple<T, T1, T2, T3, T4, T5, T6, TRest>> QueryComponents<T, T1, T2, T3, T4, T5, T6, TRest>() where TRest : struct;
2023-06-29 14:57:11 +08:00
}
}