This project demonstrates the unity editor's ability to make lua changes take effect immediately without replay the game.
这个工程展示了unity编辑器下不需要重启游戏就能让lua文件改动后立刻生效的功能。
目前实现的功能:
- 保留旧模块的数据,替换旧模块的函数
- 其它模块缓存了旧模块的函数的处理
- upvalue值的处理
- 需要更新的模块的元表的处理
- 处理了表循环引用导致无限递归的情况(2020.8.17更新)
使用的unity版本是2019.3.0,根目录下是xlua版本的工程 ,/Tolua_RuntimeHotfix是tolua版本的工程。
- package.load[filename] 获取已加载的模块失败怎么办?
请检查是不是filename这个变量传入有误,FileSystemEventArgs.FullPath是文件的完整路径,如 "F:\Git\LuaRuntimeHotfix\Assets\LuaScripts\NewDirectory1\Test.lua",需要转化成 "NewDirectory1.Test" 才能正确的调用package.load。
关于文件路径转化的代码在LuaFileWatcher.cs,如果有需要请自行修改。
打开工程里的场景SampleScene,里面是一个方块,功能很简单,按上下可以移动方块。其中逻辑是写在lua里面的。
- 如何验证热重载功能?
改动PlayerMove.lua的update函数,比如把10改成-10,会发现方块会倒着走了。
local function Update(self,deltaTime)
local verticalInput = CS.UnityEngine.Input.GetAxis("Vertical")
local movement = self.transform.forward * verticalInput * 10 * deltaTime
self.rigidbody:MovePosition(self.rigidbody.position + movement)
end
- LuaFileWatcher,检测lua文件发生变化,当发生变化时调用Hotfix.lua进行重载模块的操作。
- GameLaunch,启动LuaFileWatcher,启动XLuaManager
- XLuaManager,启动lua端的GameMain模块,并且获取lua端的update函数,并在自己的update函数里调用lua端的update
- GameMain,新建一个PlayerMove的实例,调用PlayerMove里面的update
- PlayerMove,继承自BaseClass,控制方块移动
- BaseClass,面向对象编程里的基类
- Hotfix,重载lua模块
- 【Lua运行时热更新①】检测Lua文件发生变化
- 【Lua运行时热更新②】重载Lua模块、替换函数 (2020.8.17 更新)
游戏聊天群:891809847