This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold允许您对资源进行热重载。在开发游戏时,此功能可以极大地加快某些任务的速度。它允许您在游戏运行时更改游戏的代码和内容。常见用例包括:
从编辑器启动游戏(Project ▸ Build)。
然后要重新加载更新的资源,只需选择菜单项File ▸ Hot Reload或按键盘上相应的快捷键:
热重载在设备上和桌面上一样有效。要在设备上使用它,请在您的移动设备上运行游戏的调试版本,或运行开发应用,然后在编辑器中选择它作为目标:
现在当您构建并运行时,编辑器会将所有资源上传到设备上运行的应用程序并启动游戏。从那时起,您热重载的任何文件都将在设备上更新。
例如,要在手机上运行的游戏中显示的GUI上添加几个按钮,只需打开GUI文件:
添加新按钮,保存并热重载GUI文件。您现在可以在手机屏幕上看到新按钮:
当您热重载文件时,引擎将在控制台中打印每个重新加载的资源文件。
任何重新加载的Lua脚本文件都将在运行的Lua环境中重新执行。
local my_value = 10
function update(self, dt)
print(my_value)
end
将my_value
更改为11并热重载文件将立即生效:
...
DEBUG:SCRIPT: 10
DEBUG:SCRIPT: 10
DEBUG:SCRIPT: 10
INFO:RESOURCE: /main/hunter.scriptc was successfully reloaded.
DEBUG:SCRIPT: 11
DEBUG:SCRIPT: 11
DEBUG:SCRIPT: 11
...
请注意,热重载不会改变生命周期函数的执行。例如,热重载时不会调用init()
。但是,如果您重新定义生命周期函数,将使用新版本。
只要您在模块文件中将变量添加到全局作用域,重新加载文件将更改这些全局变量:
--- my_module.lua
my_module = {}
my_module.val = 10
-- user.script
require "my_module"
function update(self, dt)
print(my_module.val) -- 热重载 "my_module.lua",新值将被打印
end
常见的Lua模块模式是构造一个本地表,填充它然后返回它:
--- my_module.lua
local M = {} -- 在这里创建一个新的表对象
M.val = 10
return M
-- user.script
local mm = require "my_module"
function update(self, dt)
print(mm.val) -- 即使您更改并热重载 "my_module.lua",仍将打印 10
end
更改并重新加载”my_module.lua”将_不会_改变”user.script”的行为。有关原因以及如何避免此陷阱的更多信息,请参见模块手册。
每个脚本组件都可以定义on_reload()
函数。如果存在,它将在脚本重新加载时被调用。这对于检查或更改数据、发送消息等非常有用:
function on_reload(self)
print(self.velocity)
msg.post("/level#controller", "setup")
end
重新加载顶点和片段着色器时,GLSL代码会被图形驱动程序重新编译并上传到GPU。如果着色器代码导致崩溃,这是很容易发生的,因为GLSL是在非常低的级别上编写的,它将使引擎崩溃。
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB