调试
调试
函数的内容告一段落了,如果对基本知识点不太清楚,可以网上搜相关内容,比如“lua函数”,可以搜出来很多关于函数的知识点。这一节主要来讲一下调试的相关内容。
调试,可以简单理解为测试,它贯穿脚本编写的整个过程。如果不会调试,那想用脚本写出来想要的效果,基本不可能。我想应该没有人敢说他一口气写出来的脚本没有bug。而许多脚本看上去效果很完美,其编写的过程中一定经过了反复的调试。下面就来讲讲如何调试。
前提
一个脚本文件能进行调试,得先保证脚本的结构是正确的。脚本能够调试的前提,就是脚本得能跑起来。就如同你想试试一辆车的性能好不好,但是车却开不起来,那样就无法测试。要判断一个脚本文件的结构有没有问题很简单,就是保存脚本的时候,如果没有报错提示,那么结构就是正确的。下面举个例子。
先写一个正确的脚本:
function a () end
脚本就定义了一个空函数,什么都没做。保存脚本:
点击右上角的红叉退出。这时脚本结构正确,不会出现报错提示。
如果我们把这个脚本修改一下,把end
去掉:
此时再点击右上角的红叉就会报错:
如果你有一点英文基础或者编码经验,就知道这个报错说的是:在第一行文件的结尾附近,需要一个end
。
此时就需要我们选择确定,并对脚本进行修改。如果选择忽略,脚本虽然能够成功保存,但是在游戏中会报错而无法运行。
总之,如果有报错提示,就说明代码结构有问题,需要根据提示检查问题并进行修改。刚开始时,这会比较难。但是,如果想写脚本,这个过程一定需要经历。
打印信息
当我们脚本写完了,保存时没有报错,但运行时却不尽如人意,这时就需要我们进行调试了。
调试基本上是通过打印信息来判断。会使用如下函数:
print(参数)
其中的参数就是我们需要确定的内容。
举个简单的例子。现在写个简单的脚本,就一行:
print(12)
保存后有两点需要注意:
- 脚本左侧需要勾选上,勾选上脚本才会执行。
- 右上角的测试需要打开,打开后才会显示调试信息。 转换玩法地图。
点击右上方的感叹号:
在弹出的界面左侧选择脚本,就可以在中间看到打印信息。小伙伴可以把print
函数的参数改一改,再看看打印出来的信息有什么变化。
好了,下面来说说这个打印信息有什么用,或者说应该怎么调试呢?下面就以上一节中的哭泣下雨的例子为例。
上一节说到了,根据API文档上的说明,我写出的脚本如下:
ScriptSupportEvent:registerEvent([=[Player.PlayAction]=], function (event)
if event.act == 3 then
GameRule.Weather = 1
end
end)
其中:
但是在游戏里运行发现没有效果。这时就需要来调试了。那我们应该调试哪些呢?
- 事件是否注册成功,即是否进入到函数体内了。
- 动作判断是否正确,即是否进入到if结构体内了。
- 天气修改是否成功,即
Weather
的值是否发生了变化。
那么根据经验(如果没有经验,那就跟着感觉写),我们可以写出如下的打印代码:
ScriptSupportEvent:registerEvent([=[Player.PlayAction]=], function (event)
print('PlayAction: ', event)
if event.act == 3 then
print('Weather: ', GameRule.Weather)
GameRule.Weather = 1
end
end)
其中第2行代码对应第1点,第4行代码对应第2点。至于第3点,如果前两点没问题,那么函数下一次执行时,通过第4行代码就可以判断。
接着把天气设置选一下,就选晴天吧:
转换玩法地图。选择哭泣动作:
然后查看打印信息:
打印了PlayAction
,说明动作注册成功了,进入了函数体。这里也可以看到eventobjid
与act
的值。
打印了Weather
,说明动作判断也没有问题。但是Weather
的值是1
。打印Weather
的值时,我们还没有修改Weather
的值,那么就说明:晴天对应的Weather
值是1
,与文档描述不符。
如果此时还不确定,那么我们再来修改一下初始天气设置,改为雨天:
转换玩法地图后,再来做个哭泣动作,看下打印信息:
可以看到Weather
的值是2
,同时发现变成晴天了。
这样就可以判断出晴天是1
,雨天是2
。同理,可以看出晴雨交替与雷暴对应的值分别是0
、3
。
但是如果将第5行代码改为如下:
GameRule.Weather = 3
多做几次哭泣动作后,依然会发现Weather的值是2。这样就说明目前无法通过脚本将天气修改为雷暴。
至于为什么会无法修改,其实原因很简单:因为雷暴是后来加上的天气,一开始只有前三种,官方开发人员就做了限制,限制Weather
值小于0
时就重置为0
,大于2
时就重置为2
。而后来加上雷暴后,这个限制逻辑没有进行相应的修改。于是,即使通过脚本赋值为3
,也会在数据校验的时候重置为2
。
本来计划再把local
讲一讲的。不过后来想了想,local
涉及的内容还是挺多的,下一节来单独讲一讲。