unity学习(77)--多玩家信息交互--不同类型的数据包

文章讲述了在Unity开发中,客户端与服务器之间的数据包交互问题,如“120包”至“124包”的作用和处理。作者通过调试发现,客户端在处理“122包”时存在问题,导致新玩家初始化失败。通过学习使用VisualStudio调试工具,解决了脚本机制导致的预构体数组为空的问题,并找到了在Unity中正确处理脚本间调用的方法。
摘要由CSDN通过智能技术生成

明白各个数据包的作用,以及是否正确的发挥作用

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)后才能移动

zhi

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值