Unity ECS之Entitas学习笔记(三)

1.问题描述


在Entitas框架中,有一个上下文的类Contexts,这个上下文其实和ECS的Entity的世界有些类似,它统筹了所有的实体。Entitas中的Contexts还能进一步进行细分,并且能由我们自己定义。比如我们在Unity编辑器中的编辑器扩展栏中的Tools/Entitas/Preference中的Contexts栏中自定义两个上下文为Game和Input分别作为游戏数据部分和输入部分的上下文。此时为我们定义的Component打上标签Game并且自动生成代码时,我们的生成代码就会归到GameContexts或者GameEntity中。同理打上Input标签的Component生成的代码也会归入InputContexts或者InputEntity中。

在实际项目中,不可避免的在InputSystem中会访问到GameContext中的实体以及组件进行逻辑操作,比如我们在一个SlideSystem中,要判断两个元素中是否含有CanMoveComponent以便进行滑动两个元素的逻辑操作。首先我们得得到元素实体,然后得到实体上是否有CanMoveComponent组件来判断能否移动,能的话我们就改变位置数据以便对应的系统能够识别数据变化并且执行对应的Execute方法

2.示例解决方案


当我们的Component组件的属性打上EntityIndex的标签并且生成代码时,Entitas的框架回为我们生成一个静态的方法,这个方法是对Contexts类的扩展方法,它会通过我们的属性(一个类似于Vector2的结构体)去得到许多符合这个属性的实体集合(这里先按照平面中一个物体对应一个二维坐标来理解)。这时就可以在任何的System中通过不同的上下文得到其中的实体集合了

比如这个是一个元素对应的位置数据,其中CustomVector2打上EntityIndex标签

    [Game, Event(EventTarget.Self, EventType.Added, 1)]
    public class ItemIndexComponent : IComponent
    {
        [EntityIndex]
        public CustomVector2 index;
    }


生成代码时会为我们生成如下的一个ContexsExtension类,里面包含一个静态方法

public static class ContextsExtensions {
    public static System.Collections.Generic.HashSet<GameEntity> GetEntitiesWithGameItemIndex(this GameContext context, Game.Data.CustomVector2 index) {
        return ((Entitas.EntityIndex<GameEntity, Game.Data.CustomVector2>)context.GetEntityIndex(Contexts.GameItemIndex)).GetEntities(index);
    }
}


这时我们如果想跨Contexts去找实体及对应的组件数据,只需调用这个扩展方法就能得到实体了

bool canMove = contexts.game.GetEntitiesWithGameItemIndex(pos).SingleEntity().isGameMovable;


其中contexts就是整个Contexts上下文,game就是其中上下文的进一步细分,由于这个静态方法得到的是一个实体的HashSet,但我们知道这里一个坐标只会对应一个实体,所以可以用SingleEntity()方法来得到单个实体,然后得到isGameMovable来进行下面的逻辑操作。

总结:将我们能通过某个组件(实例中的ItemIndexComponent)的数据的描述得到一个实体时,将里面的数据属性打上EntityIndex的标签,生成代码时Entitas框架就会为我们生成对应查找实体集的Contexts扩展方法,在使用时直接使用要查找的实体所属的Contexts(实例中的game)的对应方法即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值