unity3d游戏运行时lua热重载

上个项目体验到了关掉界面修改lua代码就会生效的便捷,这两天趁没什么紧急事项就在现在项目也加上了这个支持。

核心思想

核心思想就是

package.loaded[fileName]=nil;
require(fileName)

过程

当前项目lua文件引用有好几种:
第一种是路径作为参数传入一个叫luawindom或luaitem的cs文件,通过slua的luastate的start方法引用,也就是dofile.
第二种是传统的写在固定文件里,登录的时候统一require,
第三种是分布在各个业务系统里自己require的一些文件,也就是没按照规则放在统一加载地方的文件。

首先重载第一种方式载入的lua文件,由于当前项目目前关闭界面只是隐藏界面,并不是销毁,不好跟之前项目一样搞成按关闭界面就重载,那个载入lua文件的start函数也只会执行一次,由于每次都是隐藏,所以不会正常程序是不会再执行的,那个luaitem也是这样。我选择的方案是加一个重载按钮,点了重载就加一个标志位,如果这个界面是标志过的那就直接destroy,由于它destroy也会遍历本身包含的luaitem,所以这两个就一并解决了,非常简单。

接着,如果不是作为路径传给luaWindow或luaitem的lua文件所有人都是按照规则把require写在固定文件夹那就好办了,直接通过重载按钮传参重新require指定的文件就行,但固定文件里只有部分文件,只require那部分得不到想要的效果,所以我把第二种和第三种情况合并处理。

我观察项目目录,发现那些不按规则require的文件基本都是在对应功

你可能感兴趣的:(lua,游戏,开发语言)