• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua热重载

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

热重载,就是不重新开unity让代码的变化直接看出来,一般在开发时候使用

lua中通过require导入的文件,最终都存在package.loaded这个table中。
require会判断是否文件已经加载避免重复加载同一文件
所以需要先把package.loaded中对应的内容置空,然后再重新导入

for key,val in pairs(package.loaded) do
     print(key)
     if(key == "xxx") then
        package.loaded[key] = nil;
        require(key);
     end
end

这种重新require会让这个脚本在内存中的数据丢失,谨慎使用

1. 将package.loaded[filename] = nil, 将模块置空.

2. 重新调用require,require(filename).

所以lua如果做了分层,数据和逻辑分离,只reload逻辑层,应该是可以的

注意的是,如果重新require的代码出错了,那么

package.loaded[filename] 
会一直为nil的,会影响后面的模块

解决办法是把之前的保存一份,如果出错用老的,并且提示
-- require_ex.lua
function require_ex(filename)
    local old_content
    if package.loaded[filename] then
        -- 把旧的模块保存起来
        old = package.loaded[filename]
        -- 然后package.loaded[filename]赋空
        package.loaded[filename] = nil
    end
         
     -- xpcall下执行require
    local ok,err = pcall(require, filename)
    if not ok then
        --热更失败,将旧值赋回去
        print("hotfix fail, err msg ",err)
        package.loaded[filename] = old_content
        return false
    end

    return true
end

参考文章:https://www.cnblogs.com/lewiskyo/p/6160059.html

之前又看一个框架也有这种功能,不过他是使用类似cookie机制实现:https://www.jianshu.com/p/eebd5cfce87f


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
cocos2d-xlua实现状态机发布时间:2022-07-22
下一篇:
lua相关库安装常见问题发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap