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

79 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

有俩枚举,分别是对应,实体的移动相关,还有移动方向;
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]]