Defold 内置集成式 Lua 调试器及检视工具. 加上内置的 分析工具 构成强大工具集帮你快速找到逻辑错误和性能问题.
Defold 最基础的调试功能是 控制台打印输出. 使用 print()
或 pprint()
来检查变量值或者逻辑流程. 如果有个游戏对象不正常, 只需要将包含调试代码的脚本组件拖上去就行了. 打印输出函数会把信息发送到编辑器的 控制台 与 游戏日志 中.
更进一步来说, 引擎有绘制调试信息的功能, 可以显示文字和画线. 用此功能需要向 @render
接口发送消息:
-- 把变量 "my_val" 画在屏幕上
msg.post("@render:", "draw_text", { text = "My value: " .. my_val, position = vmath.vector3(200, 200, 0) })
-- 画出带颜色的文字
local color_green = vmath.vector4(0, 1, 0, 1)
msg.post("@render:", "draw_debug_text", { text = "Custom color", position = vmath.vector3(200, 180, 0), color = color_green })
-- 在主角和敌人之间画一条线
local start_p = go.get_position("player")
local end_p = go.get_position("enemy")
local color_red = vmath.vector4(1, 0, 0, 1)
msg.post("@render:", "draw_line", { start_point = start_p, end_point = end_p, color = color_red })
调试绘制与普通的渲染处于同一个渲染管线之上.
"draw_line"
实际是是使用渲染脚本的 render.draw_debug3d()
函数进行绘制的."draw_text"
使用的是 /builtins/fonts/debug/always_on_top.font
字体和 /builtins/fonts/debug/always_on_top_font.material
材质."draw_debug_text"
与 "draw_text"
类似, 只是可以自定义文字颜色.注意一般调试信息都需要实时更新所以把它们放在 update()
函数中是个好主意.
一种办法是通过 Debug ▸ Run with Debugger 运行游戏并且自动接入调试器, 另一种是通过 Debug ▸ Attach Debugger 把调试器接入正在运行中的游戏上.
调试器接入后, 就可以使用控制台上的调试控制按钮, 或者使用 Debug 菜单了:
nextspawn()
函数下面的 end
位置处:
一行Lua代码不一定就是一句Lua表达式. 调试器按表达式步进, 也就是说有可能出现一行多个表达式的情况就要多按几下步进才会运行到下一行.
nextspawn()
函数:
设置/清除断点, 可以在代码编辑器里行号右边右键点击. 还可以从菜单中选择 Edit ▸ Toggle Breakpoint.
要编辑断电条件, 右键点击代码编辑器行号的右边的列, 或者从菜单栏点选 Edit ▸ Edit Breakpoint.
目前不支持用表达式来修改变量.
Lua 包含一个有用的调试库, 帮你查看 Lua 环境的底层. 详情请见: http://www.lua.org/pil/contents.html#23.
如果发现错误或者bug, 建议进行如下调试:
检查控制台看看输出什么报错没有.
在适当地方加入 print
语句证明这段代码运行到了没有.
看看编辑器各种设置是否配置正确. 代码加到游戏对象上了吗? 输入得到焦点了吗? 输入消息监听对了吗? 材质上有着色程序吗? 等等.
如果某些代码取决于变量的值 (比如if语句), 使用 print
或者调试器看看那些变量值对不对.
有的 bug 藏得很深, 调试起来很费时, 需要一丝一丝地捋, 逐步缩小可能出错的范围最终消灭错误源头. 这种情况下建议使用 “二分法”:
祝你调试愉快!
如果使用物理系统过程中发现错误请开启物理调试. 在 game.project 文件的 Physics 部分, 勾选 Debug 项:
这样 Defold 就会把所有物理形状和碰撞接触点绘制到屏幕上:
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB