agiknight / LuaRuntimeHotfix

Lua runtime update module in unity

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LuaRuntimeHotfix

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

在这里插入图片描述


工程里各个脚本的作用: 在这里插入图片描述

左边是C#文件:

  • LuaFileWatcher,检测lua文件发生变化,当发生变化时调用Hotfix.lua进行重载模块的操作。
  • GameLaunch,启动LuaFileWatcher,启动XLuaManager
  • XLuaManager,启动lua端的GameMain模块,并且获取lua端的update函数,并在自己的update函数里调用lua端的update

右边是Lua文件:

  • GameMain,新建一个PlayerMove的实例,调用PlayerMove里面的update
  • PlayerMove,继承自BaseClass,控制方块移动
  • BaseClass,面向对象编程里的基类
  • Hotfix,重载lua模块

关于代码的讲解:

游戏聊天群:891809847

About

Lua runtime update module in unity


Languages

Language:C# 89.3%Language:Lua 10.6%Language:C++ 0.1%Language:Batchfile 0.0%