调试

莫小仙...大约 5 分钟Lua脚本

调试

函数的内容告一段落了,如果对基本知识点不太清楚,可以网上搜相关内容,比如“lua函数”,可以搜出来很多关于函数的知识点。这一节主要来讲一下调试的相关内容。

调试,可以简单理解为测试,它贯穿脚本编写的整个过程。如果不会调试,那想用脚本写出来想要的效果,基本不可能。我想应该没有人敢说他一口气写出来的脚本没有bug。而许多脚本看上去效果很完美,其编写的过程中一定经过了反复的调试。下面就来讲讲如何调试。

前提

一个脚本文件能进行调试,得先保证脚本的结构是正确的。脚本能够调试的前提,就是脚本得能跑起来。就如同你想试试一辆车的性能好不好,但是车却开不起来,那样就无法测试。要判断一个脚本文件的结构有没有问题很简单,就是保存脚本的时候,如果没有报错提示,那么结构就是正确的。下面举个例子。

先写一个正确的脚本:

function a () end

脚本就定义了一个空函数,什么都没做。保存脚本:

0386ff67d40b4ee69a3ce8b5eb95b774.jpg

点击右上角的红叉退出。这时脚本结构正确,不会出现报错提示。

如果我们把这个脚本修改一下,把end去掉:

a978bfeef5bb4223be723c70507b7021.jpg

此时再点击右上角的红叉就会报错:

e8a479e4e4414493a38e158d052c478b.jpg

如果你有一点英文基础或者编码经验,就知道这个报错说的是:在第一行文件的结尾附近,需要一个end

此时就需要我们选择确定,并对脚本进行修改。如果选择忽略,脚本虽然能够成功保存,但是在游戏中会报错而无法运行。

总之,如果有报错提示,就说明代码结构有问题,需要根据提示检查问题并进行修改。刚开始时,这会比较难。但是,如果想写脚本,这个过程一定需要经历。

打印信息

当我们脚本写完了,保存时没有报错,但运行时却不尽如人意,这时就需要我们进行调试了。

调试基本上是通过打印信息来判断。会使用如下函数:

print(参数)

其中的参数就是我们需要确定的内容。

举个简单的例子。现在写个简单的脚本,就一行:

print(12)

保存后有两点需要注意:

8783cc52673c469db53d01fb255a7cfc.jpg

  1. 脚本左侧需要勾选上,勾选上脚本才会执行。
  2. 右上角的测试需要打开,打开后才会显示调试信息。 转换玩法地图。

b27780ca26c049229b662db2bf73056c.jpg

点击右上方的感叹号:

ae9eb020b0764107a49eab71660800c1.jpg

在弹出的界面左侧选择脚本,就可以在中间看到打印信息。小伙伴可以把print函数的参数改一改,再看看打印出来的信息有什么变化。

好了,下面来说说这个打印信息有什么用,或者说应该怎么调试呢?下面就以上一节中的哭泣下雨的例子为例。

上一节说到了,根据API文档上的说明,我写出的脚本如下:

ScriptSupportEvent:registerEvent([=[Player.PlayAction]=], function (event)
  if event.act == 3 then
    GameRule.Weather = 1
  end
end)

其中:

4b1a21a5f2f34508a57f6aa312edfbf3.png

但是在游戏里运行发现没有效果。这时就需要来调试了。那我们应该调试哪些呢?

  1. 事件是否注册成功,即是否进入到函数体内了。
  2. 动作判断是否正确,即是否进入到if结构体内了。
  3. 天气修改是否成功,即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行代码就可以判断。

接着把天气设置选一下,就选晴天吧:

8c42f31d7ac646718d3f932b5b0f160f.jpg

转换玩法地图。选择哭泣动作:

86c907706d7945e2a6d6965ea2ba6d2b.jpg

然后查看打印信息:

ae9eb020b0764107a49eab71660800c1.jpg

打印了PlayAction,说明动作注册成功了,进入了函数体。这里也可以看到eventobjidact的值。

打印了Weather,说明动作判断也没有问题。但是Weather的值是1。打印Weather的值时,我们还没有修改Weather的值,那么就说明:晴天对应的Weather值是1,与文档描述不符。

如果此时还不确定,那么我们再来修改一下初始天气设置,改为雨天:

ce8f9f71bb5f4de888b5fa086f9de6d5.jpg

转换玩法地图后,再来做个哭泣动作,看下打印信息:

1309154bdcd44eb7b09445a52a37ee21.jpg

可以看到Weather的值是2,同时发现变成晴天了。

这样就可以判断出晴天是1,雨天是2。同理,可以看出晴雨交替与雷暴对应的值分别是03

但是如果将第5行代码改为如下:

GameRule.Weather = 3

多做几次哭泣动作后,依然会发现Weather的值是2。这样就说明目前无法通过脚本将天气修改为雷暴。

至于为什么会无法修改,其实原因很简单:因为雷暴是后来加上的天气,一开始只有前三种,官方开发人员就做了限制,限制Weather值小于0时就重置为0,大于2时就重置为2。而后来加上雷暴后,这个限制逻辑没有进行相应的修改。于是,即使通过脚本赋值为3,也会在数据校验的时候重置为2

本来计划再把local讲一讲的。不过后来想了想,local涉及的内容还是挺多的,下一节来单独讲一讲。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.7