九宫格AOI视野管理_第二章
共用的一些const常量配置,单个方块位置尺寸、移动速度、边界、任意时间间隔,任意方向
这是场景配置,包含场景id、名字,方块尺寸、初始化数量
场景中的玩家实体逻辑,先弄一个枚举,分别代表,是否在线
场景中玩家实体的具体逻辑,声明了实体ID、服务器的网络session连接,目标方向、位置、当前是否在线的布尔、是服务器创建或unity客户端创建的EntityDriverEnum枚举、还有AOI玩家实体对应的aoiEntity逻辑
服务器连接,发送数据包的两种函数重载
进入场景、退出场景、更新场景,几个函数,分别会修改对应的枚举、还有打印log,SendMsg发送网络数据包
场景的构造函数,声明了场景Config配置cfg,aoi管理器; 还有线程安全相关的字典和队列容器,分别代表实体字典,退出、进入、移动 仨队列,参考ConcurrentQueue和ConcurrentDictionary;
回到地图方块相关,还声明了几个AOICell数组,分别代表,八个方向的方块位置数组,还有一个IsCalcBoundary的布尔,是用来判断,是否可以进行,地图方块的逻辑处理运算; clientEntityConcernCount 和 serverEntityConcernCount 两个int数据,分别代表,游戏内,创建出来的玩家Entity实体,是客户端创建,还是服务器创建的,总数目; 还有三个哈希HashSet容器,是用来,处理视野变化和融合的方块变动,逻辑相关,是在该方块上的实体变动:holdSet是待在该方块上、enterSet是刚进入该方块、exitSet是离开该方块,这三个汇总实体的,数据容器; 更新item的cellUpdateItem变量,是配合Entity实体的变化,发送对应的网络数据包,和修改容器数据; 在构造函数,完成各个变量的初始化即可;
回到BattleStage场景类,EntityCellViewChange函数接口,是根据UpdateItem更新逻辑的几个队列容器,完成pkg数据包的构建和队列数据添加
继续,完成构建后,通过entityID实体ID,从实体字典中,拿到对应的BattleEntity场景实体,调用场景更新接口,判断枚举在线,发送pkg数据包即可
融合函数CellEntityOpCombine接口,是先构建一个Pkg网络数据包,然后遍历更新item的各个队列容器,完成pkg数据包的构建
继续,构建pkg剩余的退出队列容器,然后调用,工具类的序列化Serialize接口,把pkg数据包序列化,成为byte字节数组; 遍历AOICell方块类的holdSet哈希容器,向各个实体,发送这个pkg数据包,实现融合共享的相关逻辑;
初始化场景的接口,是完成各个声明出来的,配置、aoi管理器初始化,完成视野变化、实体视野融合的Action回调赋值
创建新方块的OnCreateNewCell逻辑,用lambda表达式构建,然后遍历,实体字典entityDic,发送对应NtfCell协议的数据包,设置historyTime时间,是当前,后续创建服务器ai,会用到
卸载场景,是把各个数据容器清空,配置文件置空
进入场景、场景内移动的位置更新、退出场景,分别是这三个函数处理,都是操作ConcurrentQueue线程安全的队列,入队即可
实体移动、退出,对应的俩函数,也是从实体字典,通过实体id,找到对应的Entity实体,调用上述相关接口即可
服务器支持创建Entity实体,它们的移动,是通过RandomServerAI逻辑,统一处理; 延迟一定时间,遍历实体字典entityDic,拿到其中的场景实体BattleEntity,通过EntityDriverEnum枚举判断,是否为服务器创建的实体; 然后,通过内置Random接口,得到任意方向、目标位置;
继续,遍历实体字典,调用更新场景的接口,完成坐标更新即可