• Stars
    star
    134
  • Rank 270,967 (Top 6 %)
  • Language
    C#
  • Created over 4 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Lua runtime update module in unity

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