1. TS的坑
定时器、tween里面的参数执行域caller,切记要提前用self记录,如下图,定时器、tween里面的参数执行域caller,切记要提前用self记录,如下图,
比如退出这个类时候清理掉了所有的定时器和tween动画
Laya.timer.clearAll(this);
Laya.Tween.clearAll(this);
而下图中的this指的是自己的函数,而清理定时器的这个this指的是当前类,因此当退出这个类时,虽然清理掉了所有的定时器,但此处的定时器并未关闭,这个地方依然会报错 “Cannot read property ‘localPositionX’ of null”
2.多个客户端同步的问题
*本地数据基本是控制玩家客户端,服务端返回的数据基本是多个客户端通用
所以要避免在多端工用的代码里修改或者使用本地数据。*比如
捕鱼项目中,有个本地数据LockedFishID,用来记录锁定攻击的鱼的ID。
①玩家客户端A根据LockedFishID向不断服务端发送攻击这个ID的鱼的请求 ②服务端对所有玩家客户端A\B\C\D广播攻击这个ID的鱼 ③A\B\C\D收到请求回复后进行逻辑处理,如果在此处修改了LockedFishID,那玩家A的攻击请求就会受影响。
玩家A锁定攻击鱼ID1时,玩家B也在锁定攻击鱼ID2(都是控制LockedFishID),此时A打死了一条鱼,这时在鱼死亡逻辑(多端的公用代码)里面将LockedFishID置为空,这时B的锁定攻击状态就会断开(B一脸闷逼)
3.其他容易爆异常的逻辑问题
1.炮台还没实例化完成,就收到有炮台要退出的消息,此时炮台实例为null。
2.退出房间时,有引用的数据一定要清空比如this.m_cannon = null;,否则这个值的指向的地址还在,但是地址里的数据已经被清空,一旦被调用便会报错。
3.房间内四个炮台,每个炮台有唯一的uid,但pb解析时long字段用number接收,所以会出现数据丢失导致两个炮台使用同一个uid的情况,此时炮台a已退出房间,房间内根据uid获取到的炮台就会出现null的情况。
4.切换炮台时客户端自己先处理,防止自动发射时还没响应到服务端的回复,子弹倍率没同步上的问题
5.很多时候代码中会碰到栈溢出的报错,通常是某处有死循环或者循环调用的问题。
6.离开场景时 ①定时器 ②toween动效 ③事件监听 ④鼠标监听 必须清理掉。