ECS 用法
类
实体组件系统的三个部分分别对应以下类:
- 实体(Entity) -
Stride.Engine.Entity - 组件(Component) -
Stride.Engine.EntityComponent - 系统(System) -
Stride.Engine.EntityProcessor
最小配置
组件可以通过从 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 还提供了若干可重写的方法,用于响应特定事件。它们并不复杂,从其文档注释中即可清楚用法。