明白各个数据包的作用,以及是否正确的发挥作用
1.“120包”,客户端登录时发给服务器的,服务器处理后返回“121包”。
2.“121包” ,服务器返回给客户端的,包含登录时所有在线玩家的信息。
客户端也通过createPlayer函数成功初始化了自己的gameobject。
3.“122包”,服务器告诉客户端有新玩家进入。
3.1可以收到“122包”,但是客户端并未能成功初始化其他玩家!
3.2即使关掉exe,122还是会卡包。
下面着手解决这两个问题。
3.3首先是不初始化!服务器断开连接,几乎就是因为客户端报错,就好像之前MessageManger没有绑到map2的相机上导致不收包!所以此时的问题也应该是客户端没能正确处理“122包”所引起的。
而且通过下图可以明确看到,出了121的createPlayer成功了,所有122的都失败了!
3.4通过进一步调试定位异常的位置。
登录时,正常如下。
当有其他玩家登录,客户端收到122包的时候。
说明当有其他玩家登录时,第一次122至少执行到了Debug.Log("createPlayer---2"),其他在playerList.Add(model.id, model);这句就已经异常了。因为重复了,不能再次加入。
3.5先想办法让“第一次122”走的更远一些,通过进一步定位发现是下面这句产生了一异常:
try-catch输出的异常内容如下:
你调用的对象是空的?!也就是说我的预构体数组playerProfabs[model.job]为空?!
3.6实测当有新玩家链接服务器时,客户端playerProfabs[model.job]的确为空!在121时createPlayer几次都没有问题。应该是unity脚本机制导致的问题!!!
气急败坏,被迫学会了用vs调试unity程序!
发现第二次使用createPlayer时,预构体内容已经为空了!
3.7添加监视
发现了很神奇的现象,OnLevelWasLoaded在转换场景的过程中执行了两次!这不走调试器永远都不知道!因为camera和canvas都绑定了maphandler,两次加载完后,预构体的赋值都没有问题。只保留camera的maphandler!这次OnLevelWasLoaded就只执行一次了,对这个函数的机制又有了更新的认识。
3.8当有其他玩家登录时!收到的包应该是没问题。
3.9 f11发现此时实例为空!
此时反应过来了“121包”直接调用的createPlayer,并没有初始化instance。
“122包”再想着初始化已经晚了!
3.10现在有两种解决办法,要不在unity中实现“脚本”间调用函数(new static二选一),要不把maphandler的内容整合到messageManager中!我选择尝试前者!结果是成功的!
3.10.1在maphandler中加入static变量playerProfabsStatic
3.10.2在OnLevelWasLoaded中赋值
3.10.3createPlayer中使用
3.10.4单个玩家登录时候也是立竿见影
3.10.5服务器中初始化以后就不会重复给自己返回“124”了,“123”是客户端一直向服务器发送的!
3.10.6编译对应的exe进行测试!
unity后登陆时如下:有问题
unity先登录时,exe登录时,确实接近没问题了,我感觉数据包上可能有些问题,maphandler的实例化彻底没问题了!
3.11现在问题转换成了先登录的收不到后登陆的122,后登陆的到时可以初始化出来之前的模型。这两个问题都要解决。
3.11.1先让unity后登陆 exe先登录,结果如下,成功createplayer初始化,但unity马上就嘎!123和124收发都没问题!先登录的.exe此时完全卡住了!通过多天经验我感觉是124包处理时有问题。
3.11.2,果然是"124包"有问题,很明显,没有能直行到底部!
3.11.3,利用vs去调试unity!短短一天进步飞快,dto说明收到的包确实没问题,
但其他static全部为空,
3.11.4此时游戏卡住,没有进入map2,所以static变量都是空的,调用空的进而引起了异常,十分正常的!最简单的办法就是“标志位+if”! 只要会用vs调unity,效率提升十倍!
第一次“124时”,状态是3
3代表加载状态
而正常初始化后,状态值run为0,
所以当处于loading(3)状态时,不要执行move,对应修改代码如下:
3.12再次编译exe后进行测试!只要动手做真的快的很!
3.13当unity先进的时候,122时引起instance为空!这个问题之前解决过,怎么又出来了!
4.“123包” ,客户端不停发送给服务器的,代表当前玩家的信息。单个玩家没问题。
5.“124包” ,服务器返回给客户端的,包含当前所有在线玩家的信息。和“123包”一样,单个玩家没有问题!“124包”一登上来就工作,完全独立于“123包”,“124包”转到move()的过程中要对game .state进行判断,成功加载(121)后才能移动!
文章来源:https://www.toymoban.com/news/detail-858617.html
zhi文章来源地址https://www.toymoban.com/news/detail-858617.html
到了这里,关于unity学习(77)--多玩家信息交互--不同类型的数据包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!