Xlua官网   

一、xLua的导入和hotfix的配置

        1.首先在github上下载好xlua插件,解压后有一个xLua-master文件,打开里面的Assets文件夹,将其里面的文件全部复制粘贴到自己的Unity工程项目里面(放在自己工程的Assets目录下)

        2.配置热更新的宏:在Unity中打开File-->Build Settings-->Player Settings-->找到当前发布平台(PC或Android等)的Other Settings中的Scripting Define Symbols, 然后在下面输入:HOTFIX_ENABLE,然后按下回车键即可配置完成。

        2.然后将xLua-master文件里的Tools文件夹复制到自己Unity工程的根目录下(即该Tools文件夹与自己工程Assets文件夹位置并列。

        3.找到自己Unity的安装位置,按D:\Unity\UU\Unity2017.3\Editor\Data\Managed打开(具体情况看个人安装位置),然后找到Unity.Cecil.dll、Unity.Cecil.Mdb.dll、Unity.Cecil.Pdb.dll 三个文件,将其复制粘贴到自己的工程中的Assets/XLua/Src/Editor下

       

Lua宏 Lua宏文件导入_lua

可以看到在Unity的顶上窗口中多出了XLua一栏,点击发现有三个选项

Lua宏 Lua宏文件导入_Lua宏_02

Generate Code主要用来生成代码,当自己在VS中的代码发生修改后,必须要先点击该项来重新生成代码,然后控制台会有输出打印信息:

Lua宏 Lua宏文件导入_Code_03

注意一定要等待Unity编译后再选择:Hotfix Inject In Editor,即等待Unity右下方的转动标志消失,然后可以看到控制台打印输出一行:had injected或者finished,说明注入成功。

特别注意1:Unity的工程项目路径一定不要出现中文,否则无法热更新,所有路径一点中文都不能出现,一定一定一定要注意!!!踩坑证实

特别注意2:当发布项目的时候,可能会出现奇怪的报错,这个时候需要将Project视图下的Xlua文件夹里的Example全部删除掉,然后发现又出现各种报错,这个时候需要点击顶上视图的XLua的Clear Generated Code,意思是清空已生成的代码,然后再点击Generate Code、Hotfix Inject In Editor即可全部配置完成

二、正式开始打热补丁

      新建一个类叫HotFixScript,将其挂在场景中的游戏物体中,打开编辑它,首先引入XLua命名空间,然后定义创建lua虚拟机,然后通过loader加载的方式在C#这边调用lua代码,注意lua代码可以用记事本创建,将后缀名改为.lua.txt, 我的脚本叫做fish.lua.txt, 可以在fish.lua.txt中写上几行代码,如写上:print("HelloWorld")

我的代码如下:

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using XLua;
 using System.IO;public class HotFixScript : MonoBehaviour {
    private LuaEnv luaEnv;
    void Start () {
         luaEnv = new LuaEnv();
         luaEnv.AddLoader(MyLoader);
         luaEnv.DoString("require 'fish'");
     }    void Update () {
         
     }
     private byte[] MyLoader(ref string filePath) {
         string absPath = @"D:\A_Plan\Lua_4Lv_Code\XluaProjects\MyLuaCode\" + filePath + ".lua.txt";
         return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
     }    void OnDisable()
     {
         luaEnv.DoString("require 'fishDispose'");
     }
     void OnDestroy()
     {
         luaEnv.Dispose();
     }
 }

编辑好后,在Unity中选择顶上视图中的XLua,选择Generate Code,编辑好后,再选择Hotfix Inject In Editor,可以看到Unity控制台输出HelloWorld。

三、给自己的代码打热补丁

        找到自己需要修改的类中,首先引入命名空间。打开它在类名的上一行打上标签:[HotFix],然后在需要修改的方法名上方打上标签:[LuaCallCSharp]

        然后找到刚刚新建的文本文件fish.lua.txt,打开,编辑它:

 

local UnityEngine = CS.UnityEngine

xlua.private_accessible(CS.Gun)  --由于C#中类的私有成员Lua访问不到,所以需要加该行代码
xlua.hotfix(CS.Treasour,'CreatePrize',function(self)
--  ... 这里面写lua方法体
end)

如上,Treasour是C#需要修改的类,CreatePrize是该类中要修改的方法,后面的function即是lua用来替代该方法的Lua函数

然后还要记得另外创建一个fishDispose.lua.txt文件用来清空方法的引用,否则当lua虚拟机释放后会报错,在上面的HotFixScript的OnDisable方法中已写调用了该方法,在fishDispose.lua.tx写上:
local UnityEngine = CS.UnityEngine
xlua.hotfix(CS.Treasour,'CreatePrize',nil)

然后在Unity中又执行操作:生成代码、注入编辑器。(只有当VS中的代码有改变时才执行这两步,.lua.txt中代码发生改变不需要执行这两步操作)

注意:Clear Genearted Code ,当lua代码出现非语法错误时,可以尝试该选项,然后再重新生成代码,注入编辑器