有俩枚举,分别是对应,实体的移动相关,还有移动方向; TransferEnter,其余实体,进入到玩家视野; TransferOut,其余实体,走出玩家视野; MoveCross,实体移动出,当前地图块; MoveInside,实体移动在,当前地图块内; 而CrossDirEnum枚举,对应的,就是八个方向;

回到AOI实体类,声明了x和z的坐标获取器,移动状态EntityOpEnum枚举变量,移动方向CrossDirEnum枚举变量,还有标识客户端/服务器创建的EntityDriverEnum枚举变量; 还有周边地图方块的aroundAddCell数组,俩List容器的,添加/删除Lst变量,还有实体更新的entityUpdateItem变量; 在构造函数,完成其中一些变量的初始化;

回到AOI管理类,CalcCellBoundary函数接口,是用于计算生成,地图方块的核心逻辑,当前方块的,周边方块数组AroundArr,数量为9; 然后设定上,两个for循环,遍历 x 和 y 的 -2 到 +2 ,纵横一共5*5=25个地图方块,被实例化出来,这也是刚进游戏的时候,最初创建的,地图方块数量; Invoke触发OnCreateNewCell创建回调函数; 再完成,周边方块数组AroundArr的填充即可;

然后,分别是8个方向的数组填充,最后IsCalcBoundary这个,可计算方块的布尔,设置为true就好

实体的位置更新逻辑UpdatePos接口,根据所在xy坐标构成的_cellkey字符对比,判断是否,步入到新的地图块; 如果不等,说明步入新的地图块,last相关的Index索引,用于存储上一坐标点,然后完成,新坐标点的赋值; 需要注意的是,如果cellKey不为空,说明它已经在一个方块上了,需要调用aoi管理器,对应的MarkExitEntityCell接口,让该方块标识到exitSet队列容器,移除该方块的实体管理;

当前index索引,和之前的lastIndex索引对比,可以得到,移动的方向,完成CrossDirEnum枚举的修改

继续,方向确定后,调用管理器的MoveCrossCell接口,进入新的方块位置即可

如果没有进入新的方块,在原方块移动,就调用aoi管理器的,MoveInsideCell的逻辑即可

实体周边方块数组、添加方块队列容器、移除方块队列容器,在这仨函数,完成逻辑处理即可; 需要注意的,项目加载出来地图方块后,不会移除销毁它们,当前需求是这样,然后是根据cell地图方块上,所管理和包含的,其余玩家entity实体,进行其余玩家entity的显示隐藏,生成销毁; 因为这些显示隐藏、生成销毁,都是表现方面的,所以需要判断,EntityDriverEnum枚举是Client客户端,才调用这方面的逻辑;

计算实体周边视野变化的,是CalcEntityCellViewChange函数接口,就是基于cell方块上的哈希数据容器holdSet,完成周边,其余玩家entity实体的显示隐藏、生成销毁,逻辑相关

继续,完成上述,视野变化逻辑后,清空相关容器即可