雪月Lua框架的热更新非常简单,只需要调用就行了。
代码解释
local storm = require 'jass.storm'
--- 热更新.注意别死循环。
---@param Entry string 入口文件(require用的路径) 一般是 Main
function hotFix( Entry )
package.loaded[ Entry ] = nil
xpcall(require, function (msg)
print(msg, debug.traceback())
end, Entry)
end引入
jass.storm模块:local storm = require 'jass.storm'这行代码引入了
jass.storm模块。jass.storm是魔兽争霸III(Warcraft III)中用于JASS(Jass Ascension Scripting System)的Lua绑定库。它提供了与JASS交互的功能。定义
hotFix函数:--- 热更新.注意别死循环。 ---@param Entry string 入口文件(require用的路径) 一般是 Main function hotFix( Entry )hotFix是一个函数,用于执行热更新操作。Entry是一个字符串参数,表示要加载的入口文件的路径(通常是Main或其他模块的路径)。
清除已加载的模块:
package.loaded[ Entry ] = nilpackage.loaded是一个表,存储了所有已加载的模块。通过将package.loaded[ Entry ]设置为nil,可以清除之前加载的模块,以便重新加载最新的版本。
使用
xpcall加载模块:xpcall(require, function (msg) print(msg, debug.traceback()) end, Entry)xpcall是一个保护调用函数,用于捕获和处理可能发生的错误。require是Lua的标准函数,用于加载和返回模块。function (msg)是一个错误处理函数,当require执行过程中发生错误时会被调用。msg是错误信息。debug.traceback()返回调用堆栈信息,有助于调试。
如何使用
假设你有一个脚本 热更新.lua,并且你希望在游戏运行时动态更新这个脚本。以下是使用 hotFix 函数的步骤:
创建脚本:
在scripts文件夹中创建一个热更新.lua文件,内容如下:-- 热更新.lua print("热更新.lua 加载成功!") -- 其他逻辑代码调用
hotFix函数:
在你的入口脚本main.lua中调用hotFix函数,以加载和更新热更新.lua。-- main.lua -- 引入热更新脚本 require 'xLua.Main' --载入框架 -- 可以用一个玩家输入事件来执行热更新 local trg1 = cj.CreateTrigger() cj.TriggerRegisterPlayerChatEvent(trg1, cj.Player(0), "100", true) cj.TriggerAddAction(trg1, function () hotFix('热更新') cj.DisplayTimedTextToPlayer(cj.Player(0),0,0,30,"热更新成功") end) -- 其他触发器逻辑 -- ...修改并测试:
- 启动魔兽争霸III并加载你的地图。
修改
热更新.lua文件,例如添加新的打印语句:-- 热更新.lua print("热更新.lua 加载成功!") print("这是新的打印语句!") -- 其他逻辑代码- 保存
热更新.lua文件。 - 观察游戏中的输出,确保新的打印语句被正确加载。
注意事项
路径问题:
- 确保
Entry参数的路径正确,并且脚本文件在游戏运行时可访问。 - 路径通常是相对于
scripts文件夹的相对路径。
- 确保
避免死循环:
- 确保
hotFix函数不会被无限递归调用,否则会导致死循环。
- 确保
错误处理:
- 在实际应用中,添加更多的错误处理逻辑,以确保热更新过程中的稳定性。