81 lines
4.0 KiB
Markdown
81 lines
4.0 KiB
Markdown
![]() |
Area Of Interest,兴趣范围,缩写AOI
|
|||
|
|
|||
|
![[Pasted image 20240416130822.png]]
|
|||
|
|
|||
|
九宫格AOI视野,有对应两个工程,分别对应客户端、服务器端,其中使用了[[通用异步网络通信库]]作为,网络通信逻辑框架,参考即可
|
|||
|
|
|||
|
![[Pasted image 20240415173443.png]]
|
|||
|
|
|||
|
|
|||
|
服务器端,通信相关的cmd枚举
|
|||
|
|
|||
|
![[Pasted image 20240416113751.png]]
|
|||
|
|
|||
|
这是不同通信协议,对应的消息包结构,都是包含了可序列化Serializable标签;
|
|||
|
EnterMsg是进入游戏的实体结构,包含实体ID、xy的坐标位置信息;
|
|||
|
MoveMsg是实体移动的结构,也是包含移动的实体ID、xy的坐标位置信息;
|
|||
|
ExitMsg是退出游戏的实体结构,包含退出的实体ID;
|
|||
|
NtfCell是地图方块的结构,包含方块所在的,xy坐标位置信息;
|
|||
|
|
|||
|
![[Pasted image 20240416114107.png]]
|
|||
|
|
|||
|
继续,SndMovePos就是玩家自身的,移动结构,包含玩家自身的实体ID,xy坐标信息;
|
|||
|
SndExit就是玩家退出的结构,包含玩家自身的实体ID;
|
|||
|
|
|||
|
![[Pasted image 20240416114706.png]]
|
|||
|
|
|||
|
继续,这分别是,客户端发过来的登录请求 ReqLogin协议,和服务器返回的RspLogin 回应客户端登录,结构是一个实体id
|
|||
|
|
|||
|
![[Pasted image 20240416115319.png]]
|
|||
|
|
|||
|
统一管理、玩家实体、地图方块的NtfAOIMsg协议相关;
|
|||
|
其中enterLst是,进入游戏的队列容器;
|
|||
|
moveLst是,游戏内移动的队列容器;
|
|||
|
exitLst是,退出游戏的队列容器;
|
|||
|
三者分别用了,上述解析的EnterMsg、MoveMsg、ExitMsg协议结构体,然后在Tostring的字符串打印重写逻辑中,完成字符构建;
|
|||
|
|
|||
|
![[Pasted image 20240416115453.png]]
|
|||
|
|
|||
|
Pkg结构体,继承自异步协议结构体AsyncMsg,包含声明,以上协议结构体变量
|
|||
|
|
|||
|
![[Pasted image 20240416115814.png]]
|
|||
|
|
|||
|
服务器的Session网络连接,对应逻辑,继承自异步连接AsyncSession,完成连接、断连,接受消息包的逻辑重写,其中用到的服务器根类逻辑,ServerRoot会在后续解析;
|
|||
|
其中NetPack是网络包,构造函数中,完成连接session,和消息包体pkg的初始化赋值即可;
|
|||
|
|
|||
|
![[Pasted image 20240416113909.png]]
|
|||
|
|
|||
|
在进入游戏、角色移动过程,其他玩家实体item,他们会进游戏、移动、进入玩家视野,还有退出游戏;
|
|||
|
这里的几个结构体,分别是对应以上几种情况;
|
|||
|
|
|||
|
![[Pasted image 20240416121936.png]]
|
|||
|
|
|||
|
声明三个list容器,分别对应三种情况的实体,IsEmpty布尔的获取器,是三者数量的与判断逻辑;
|
|||
|
构造函数,通过传参拿到,容器的初始count大小,容器初始化;
|
|||
|
Reset接口,就是重置各个容器即可;
|
|||
|
|
|||
|
![[Pasted image 20240416125336.png]]
|
|||
|
|
|||
|
Tostring字符显示重写逻辑,遍历三个数据容器,完成string字符串构建
|
|||
|
|
|||
|
![[Pasted image 20240416125543.png]]
|
|||
|
|
|||
|
AOIEntity是实体类,在它之前,先弄一个EntityDriverEnum枚举,用来区分,是unity客户端创建出来的实体,还是服务器端,创建出来的实体;
|
|||
|
构造函数,包含实体id,aoi管理器,后续会解析,还有个体移动的坐标相关、所在地图位置名称的cellkey字符相关;
|
|||
|
|
|||
|
![[Pasted image 20240416125639.png]]
|
|||
|
|
|||
|
地图宫格对应的类,是AOICell,声明了xy的索引坐标,管理器,还有周边aoi方块数据的数组容器AroundArr
|
|||
|
|
|||
|
![[Pasted image 20240416125915.png]]
|
|||
|
|
|||
|
配置类,包含地图名字,方块大小size,对应的初始化数量,配置了200;
|
|||
|
还有三个int数据,分别是后续会用来,设置UpdateItem更新实体逻辑相关的,仨数据容器的,初始大小;
|
|||
|
|
|||
|
![[Pasted image 20240416130106.png]]
|
|||
|
|
|||
|
AOI管理器,声明了对应的配置文件、方块大小、进入游戏的玩家AOIEntity队列容器entityLst,还有地图方块字典容器cellDic,搭配UpdateItem的,玩家实体更新逻辑,设定的俩Action委托回调函数OnEntityCellViewChange 和 OnCellEntityOpCombine;
|
|||
|
还有一个创建,地图方块的Action委托OnCreateNewCell;
|
|||
|
在构造函数中,对声明出来的变量,完成初始化即可;
|
|||
|
|
|||
|
![[Pasted image 20240416130247.png]]
|