首页 > 其他分享 >(转)我所理解的Entitas——Matcher Collector(五)

(转)我所理解的Entitas——Matcher Collector(五)

时间:2023-07-15 19:45:56浏览次数:35  
标签:group MoveComponent Entitas Matcher Entity matcher Group Collector GetGroup

图中可以看到一个Context具有多个Entity,每个Entity可能会被N个Group所关心。

Group
一个Context中可能会同时存在很多个Entity,但是有些时候我们只需要处理某些Entity,那么我们可以通过Group来快速访问,每个Context内部维护一个Group对象集合,调用GetGroup()方法可以拿到Group,相同得Matcher参数拿到得是相同得Group对象。
Group是实时更新的一个具有相同筛选条件的Entity的组合,它会自动添加具有筛选条件的Entity,并删除失去筛选条件的Entity,以提高下一次的访问速度。

public IGroup<TEntity> GetGroup(IMatcher<TEntity> matcher)
    {
        if (!_groups.TryGetValue(matcher, out IGroup<TEntity> group))
        {
            group = new Group<TEntity>(matcher);
            TEntity[] entities = GetEntities();
            for (int i = 0; i < entities.Length; i++)
            {
                group.HandleEntitySilently(entities[i]);
            }
            _groups.Add(matcher, group);
            for (int j = 0; j < matcher.indices.Length; j++)
            {
                int num = matcher.indices[j];
                if (_groupsForIndex[num] == null)
                {
                    _groupsForIndex[num] = new List<IGroup<TEntity>>();
                }
                _groupsForIndex[num].Add(group);
            }
            if (this.OnGroupCreated != null)
            {
                this.OnGroupCreated(this, group);
            }
        }
        return group;
    }

可以通过GetEntities()拿到Group中得所有Entity。通过ContainsEntity()接口判断Group中是否包含某个Entity。

Gorup提供了OnEntityAdded,OnEntityRemoved,OnEntityUpdated事件委托监听Group内部得Entity变化。

gameContext.GetGroup(GameMatcher.Position).OnEntityAdded += (group, entity, index, component) => {
        // Do something
    };

Matcher

Matcher是Group的筛选条件,筛选条件就是Context中所拥有的Component。
例:
我们有MoveComponent和AttackComponent两个组件存在Game Context中。则我们可以有一下几种查询方式:

//查找所有有MoveComponent的Entity
    var moveEntitys = contexts.game.GetGroup(GameMatcher.Move);

    //查找所有有AttackComponent的Entity
    var attackEntitys = contexts.game.GetGroup(GameMatcher.Attack);

    //查找所有有MoveComponent和AttackComponent的Entity
    int[] allMatcher = { GameComponentsLookup.Move,GameComponentsLookup.Attack };
    var AllEntitys = contexts.game.GetGroup(GameMatcher.AllOf(allMatcher));

    //查找所有有MoveComponent或AttackComponent的Entity
    int[] anyMatcher = { GameComponentsLookup.Move, GameComponentsLookup.Attack };
    var AnyEntitys = contexts.game.GetGroup(GameMatcher.AnyOf(anyMatcher));

Collector
通过Group和Matcher已经可以拿到所有符合条件的Entity,例如所有具有MoveComponent的Entity。也说过了Group会实时更新,但是如果我们需要知道Group中当前哪些Entity是新加进来的。则可以通过Collector来找到。
例:

//查找所有有MoveComponent的Entity
    var moveEntitys = contexts.game.GetGroup(GameMatcher.Move);
    //找到哪些Entity是刚刚获得了MoveComponent然后被添加到Gorup中的
    var collect = moveEntitys.CreateCollector<GameEntity>(GroupEvent.Added);

GroupEvent

+ Added         添加到Gorup中的
+ Removed       从Group中移除的
+ AddedOrRemoved    所有变化的(包含添加的和移除的)

 

总结:
前面说过了空军指挥部(System_3)可以指挥拥有开飞机(Component_3)技能的士兵(Entity)飞往指定的地方完成任务A,那么就需要通过Group拿到所有能开飞机(Component_3)的士兵(Entity)。
但是可能所有能开飞机(Component_3)的士兵(Entity)都在执行任务B,这时候可以加班训练新的士兵(Entity)让其拥有开飞机(Component_3)的技能,然后通过Collector找到这些刚刚学会开飞机(Component_3)技能又不在出任务的士兵(Entity)去完成任务A。

原文地址:https://blog.csdn.net/u010020342/article/details/109898655?spm=1001.2014.3001.5502

 

标签:group,MoveComponent,Entitas,Matcher,Entity,matcher,Group,Collector,GetGroup
From: https://www.cnblogs.com/wodehao0808/p/17556772.html

相关文章

  • (转)我所理解的Entitas——IInitializeSystem(六)
    从这章这开始我们以一个小案例分章介绍Entitas为我们提供的五种类型的System。案例的主要功能比较简单,大致的流程如下:在游戏启动时在屏幕上创建一个站立的小熊,点击键盘上的左右按键时将小熊切换成一个对应方向的Sprite,朝对应方向移动并实时打印位置信息。松开左右按键时切换回站......
  • Stream - Collectors.groupingBy实现分组后,且每个分组也进行排序
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Stream-实现分组后,且每个分组也进行排序前言一、groupingBy高级用法二、先分组,再排序总结 前言之前记录过:stream的三个常用方式(toMap,groupingBy,findFirst)。这里继续记录下groupingBy的几个高......
  • 使用Java8 Stream流中的Collectors.collectingAndThen()方法去重
    https://blog.csdn.net/qq_40474184/article/details/122043378Stream流的常用方法大全https://blog.csdn.net/weixin_52317961/article/details/128117727......
  • Collectors全部的方法
    Collectors类提供了很多方法来进行汇总和收集操作。以下是Collectors类中的全部方法:toList():将流中的元素收集到一个List集合中。toSet():将流中的元素收集到一个Set集合中。toMap(Function<?superT,?extendsK>keyMapper,Function<?superT,?extendsU>valueMap......
  • PostgreSQL 15 stats collector 在取消后是如何实现的原有功能的
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。在POSTGRESQL15有一个重要的功能去掉了statscollector在说为什么去掉这个statscollector的问题前,我们先得弄清出statscoll......
  • (转)我所理解的Entitas——Jenny代码生成器(序章)
    前(fei)言(hua)使用Entitas集成的代码生成器时如果代码有报错需要先把报错处理掉。如果我们是想删除某个Component或者修改Component中数据类型时就很麻烦。使用Jenny代码生成器时则不用理会这些,直接删除某个Component然后重新生成就行。获取JennyAssetStore导入Entitas时会带有J......
  • (转)我所理解的Entitas——入门(一)
    关于ECS框架ECS框架被大家所熟知是源于2017年GDC大会上《守望先锋》针对他们关于ECS架构的做了一次技术分享,在此之前ECS框架只是并未被广泛使用和流传。和传统的OOP框架以类为基础将数据和逻辑放在类中处理的方式不同,ECS是以功能为基础,遵循组合优于继承的原则将功能分开处理。这样......
  • UriMatcher
    https://developer.android.com/reference/android/content/UriMatcher.htmlpublicclassUriMatcherextendsObject UtilityclasstoaidinmatchingURIsincontentproviders.Tousethisclass,buildupatreeofUriMatcherobjects.Forexample:pri......
  • jest matchers
    expectmatchermorebooleantoBeTruthy()toBeFalsy()objecttoStrictEqual()toEqual()exceptiontoThrow(error)snapshorttoMatchInlineSnapshot()toMatchSnapshot()object优先使用toStrictEqual。因为undefined属性也会被检查。e.g.{a:undefine......
  • ABC302Ex Ball Collector 题解
    注意到当有那些\((a_i,b_i)\)是确定的时,答案就是将\((a_i,b_i)\)连边后每个连通块的\(\min(|V|,|E|)\)之和。那么这个东西用可撤销并查集维护即可。#include<algorithm>#include<cstdio>usingnamespacestd;constintN=2e5;structEdge{intto,nxt;}e[......