dotaai吧 关注:21,488贴子:482,892
  • 10回复贴,共1页

为啥我玩地图老弹窗报错~—科普贴

取消只看楼主收藏回复

游戏弹窗崩了是因为代码里执行到一些错误地方,偶尔一执行就玩不了的那是致命性错误,经常执行才崩的那不致命但跑得多了就变严重了,这种一般是某个特定英雄或者特定物品等等才导致的,重复多玩几遍是很容易就抓到错误地点的。上轮已经分析过了如何去获取错误泄露所在,无奈现在贴吧里的人悟性不比以前,今儿就给你们讲讲如何分析错误。
首先,先找到错误开关把runtime.handle_level去设为2,哦,不对,这个runtime应该先用localruntime=require'jass.runtime'去赋值,然后把老弹窗的英雄多玩几遍,这时候否管他崩不崩只要遇到错误了就有这样一个类似的东东写进日志了


IP属地:广东1楼2026-10-23 20:12回复
    这里面已经把报错的行数和函数名都报出来了,你跟着找到去修补下不就完事了。正常流程就是这样,但是今天要教的是更高级更复杂一种。上面这种错误并不是B3E这个函数导致的,而是乱用EVENT_PLAYER_UNIT_某某事件造成,所以要么把技能和物品注掉一个一个去排查,或者在玩家事件前用debug.getinfo去记录调用地方,等错误发生时找找前面那个。然后我就找到了这个出错的地方


    IP属地:广东2楼2026-10-23 20:13
    回复
      2026-11-03 05:07:22
      广告
      不感兴趣
      开通SVIP免广告
      EVENT_PLAYER_UNIT_USE_ITEM事件类似于变量中的全局变量,而且他依赖的数据结构是共用的,所以不能销毁而是用类似全局单位组的GroupClear方法来处理,也就是DisableTrigger来解决,但它并不负责排泄所以你不能每次进来都创建给它,而应该把它绑定到英雄单位上,没有就创建有就修改或者挪它到别的地方用一个开关来开启。
      但是它报的是attack,玩家事件里就只有使用物品事件不能销毁吗,当然NoNoNo,还有个EVENT_PLAYER_UNIT_ATTACKED事件也会出错的,因为它就是跟攻击直相关的啊,那么聪明的冰娃以前是怎么处理的呢,为此我特地从吧里找了份经常弹窗的和正常版本的做个对比。如下


      IP属地:广东3楼2026-10-23 20:21
      回复


        IP属地:广东4楼2026-10-23 20:26
        回复
          这是赏金的疾风步,上边的是异常版本,它多注册了个EVENT_PLAYER_UNIT_ATTACKED,而上面下面无论哪个事件销毁都会把它销毁掉,这就导致最开始图片里的错误经常出现然后弹窗玩不下去啦,下边的是正常版本,只不过它在QC9里多了句MB7(p5, "WindWalkBH|Active"),也就是已经进入隐身时间标记赏金已经开启偷袭状态,在QB9里多了句M37(p5, "WindWalkBH|Active")也就是技能已经失效结束去除赏金偷袭状态,然后它的EVENT_PLAYER_UNIT_ATTACKED挪到了这里


          IP属地:广东5楼2026-10-23 20:26
          回复


            IP属地:广东6楼2026-10-23 20:27
            回复
              这是专放技能触发的地方,这里注册的一般不会去销毁,但既然不去销毁这个攻击事件一直运行岂不浪费性能,当然不是啦,它里面首先就是用HasExBuff(GetAttacker(),"WindWalkBH|Active")去判断,只要它还在MB7调用就能触发,这样就不会有太多消费性能也不会泄露啦。
              再看下面这个


              IP属地:广东7楼2026-10-23 20:27
              回复


                IP属地:广东9楼2026-10-23 20:44
                回复
                  2026-11-03 05:01:22
                  广告
                  不感兴趣
                  开通SVIP免广告


                  IP属地:广东10楼2026-10-23 20:45
                  回复
                    这个是圣堂的隐匿技能,上边是异常版本,然后它也是多注册了个攻击事件,但是它的IBE里面没有任何GetTriggerEventId()==EVENT_PLAYER_UNIT_ATTACKED判断,同样其他事件销毁也会让它销毁,这不是白白加了个错误嘛。难怪有那么多英雄玩家一玩就报错结束,还有人傻傻的以为是游戏和概率的问题,这多是底层技能有问题,如果是出错的英雄去十个相同英雄模式下玩崩得更容易。


                    IP属地:广东11楼2026-10-23 20:45
                    回复
                      所以说嘛,不管是作图也好改图也罢,这个错误日志记录还是很有用的,很多Ai图做的是很稳定功能也很不错,并不怎么存在什么问题难以解决的事,不会解决你可以去找张同样差不多的图看看先辈们是怎么做的就完事了。对于玩家的需求来说肯定是想玩一张流畅又稳定的地图了,所以改图者首先应该做到图玩起来一般没有错误出现在日志之类,这可以找人或自己把全部英雄都让-SH模式下跑一遍就知道了。其次是没有各种句柄之类泄露,排查方法上次已经说过了。最后就是针对地图性能做些优化特别是单位非常多的时候,比如后期单位多但都得走一个攻击事件调物品的攻击效果,里面全是if就容易卡了。比如斧王的点灯为了加移速提成就得满地图找点灯单位。比如猴子的幻像上限用玩家单位组来统计数量。图做好了做精了改图之道才算入门了。


                      IP属地:广东12楼2026-10-23 20:45
                      回复