Table of Contents

ECS 用法

类

实体组件系统的三个部分分别对应以下类:

最小配置

组件可以通过从 EntityComponent 派生一个类来定义。通过为 EntityComponent 添加 DefaultEntityComponentProcessor 特性,可以为其指定一个 EntityProcessor。如果该 EntityComponent 处于场景中,就会自动设置并运行这个 EntityProcessor。EntityComponent 还需要通过添加 DataContract 特性来表明它可以被序列化。系统则可以通过从 EntityProcessor 派生一个类来定义。

代码

组件

[DataContract(nameof(MyComponent))]
[DefaultEntityComponentProcessor(typeof(MyProcessor))]
public class MyComponent : EntityComponent
{
    public int MyValue { get; set; }
}

系统

public class MyProcessor : EntityProcessor<MyComponent>
{
    public override void Update(GameTime time)
    {
        foreach (var myComponent in ComponentDatas.Values)
        {
            Console.WriteLine($"myComponent with value {myComponent.MyValue} at {time.Total.TotalSeconds}");
        }
    }
}

补充说明

目前无法将 EntityComponent 直接拖放到 Game Studio 中的实体上。必须先选中一个实体,然后点击**属性面板(Property grid)**中的 Add component 按钮来添加。 也可以通过代码 entity.Add(entityComponent) 完成。

高级功能

更多组件特性

Display

通过添加 Display 特性,可以在 Game Studio 中显示一个更友好的名称。

[Display("My better name")]

ComponentCategory

默认情况下,你的组件会列在“Miscellaneous(杂项)”分类中。通过添加 ComponentCategory 特性,可以选择其他分类。如果所选名称尚不存在,它会被添加到 Game Studio 的列表中。

[ComponentCategory("My own components")]

ComponentOrder

通过添加 ComponentOrder 特性,可以更改组件在 Game Studio 中的列出顺序。

[ComponentOrder(2001)]

组件组合

将其他组件的类型传入 EntityProcessor 构造函数后,它将只包含_同时拥有这些其他组件_的实体。例如,下面的 EntityProcessor 针对 MyComponent,但会跳过任何没有同时带有 TransformComponent 和 AnimationComponent 的实体。

public class MyProcessor : EntityProcessor<MyComponent>
{
    public MyProcessor() : base(typeof(TransformComponent), typeof(AnimationComponent))
    {
    }
}

非默认处理器

上面介绍了通过 DefaultEntityComponentProcessor 特性为某类组件添加处理器的方法。不过,正如其名,这用于_默认_处理器。非默认处理器也可以通过以下方式添加:

SceneSystem.SceneInstance.Processors.Add(entityProcessor);

EntityComponent 与数据的分离

EntityProcessor<TComponent> 是 EntityProcessor<TComponent, TComponent> 的简写。改用 EntityProcessor<TComponent, TData> 后,可以为实际数据选择不同的类型。这样,EntityComponent 可以携带“较重”的启动数据和引用,而每帧都需要处理的数据对象则可以保持很小。这需要重写 GenerateComponentData 方法,该方法由一个 TComponent 实例生成一个 TData 实例。

重写

EntityProcessor 还提供了若干可重写的方法,用于响应特定事件。它们并不复杂,从其文档注释中即可清楚用法。