obsidian/笔记文件/2.笔记/九宫格AOI视野管理_第二章.md

85 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

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