obsidian/笔记文件/2.笔记/九宫格AOI视野管理_第三章.md
2025-03-26 00:02:56 +08:00

3.8 KiB
Raw Permalink Blame History

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

!Pasted image 20240416155937.png

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

!Pasted image 20240416160839.png

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

!Pasted image 20240416164745.png

!Pasted image 20240416164531.png

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

!Pasted image 20240416165243.png

!Pasted image 20240416165300.png

!Pasted image 20240416165305.png

!Pasted image 20240416165313.png

!Pasted image 20240416165322.png

!Pasted image 20240416165331.png

!Pasted image 20240416165338.png

!Pasted image 20240416165345.png

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

!Pasted image 20240416165619.png

!Pasted image 20240416171639.png

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

!Pasted image 20240416170642.png

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

!Pasted image 20240416170728.png

!Pasted image 20240416171753.png

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

!Pasted image 20240416172158.png

!Pasted image 20240416172238.png

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

!Pasted image 20240416172312.png

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

!Pasted image 20240416172832.png

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

!Pasted image 20240416173006.png