xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档
官网:https://github.com/Tencent/xLua
配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md
常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md
接下来我们来走一遍使用xlua的大致流程:
第一步:下载xlua:进入官网并下载整个xlua项目
第二步:将xlua导入项目:将下载后的xLua-master文件夹下的Assets文件夹拷贝到项目文件夹下,将Tools文件夹拷贝到项目文件夹Assets的同级目录下并删除其中的System.Core.dll文件
这一步完成后unity编辑器的工具栏会多出一个Xlua的选项,其中里面会有两个子选项(Gennerate Code生成脚本、Clear Gennerate Code清除脚本)
第三步:开启热更新:打开playersettings,开启脚本宏命令标志输入HOTFIX_ENABLE并按ENTER(即找到othersetins中的ScriptsingDefineSymbols输入HOTFIX_ENABLE并按ENTER)敲完按回车才会进行编译
编译完成后Xlua选项中多了一项(Hofix Inject In Editor)
C#脚本发生了任何更改都需要按选项1来生成代码,有问题就选项2清楚脚本再重新生成,生成代码结束后会debug一个finished出来,此时再选项3进行注入
图片来源:https://blog.csdn.net/ChinarCSDN/article/details/81124973
第四步:打开unity安装目录中的Editor\Data\Managed\Unity.Cecil.Pdb.cll、Mdb.dll、.cll三个文件拷贝到工程目录下的xula文件夹下的src的editor文件夹下
关于XLua的使用:
xlua在项目中的启动、调用、结束等全过程:
我们使用一个脚本来管理xlua的流程 HotfixScript
脚本中创建一个唯一的解释器 new LuaEnv()
加载自定义loader AddLoader()
搜寻并执行lua文件 Dostring(" require 'lua文件名' ")
private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv();//创建解释器 luaEnv.AddLoader(MyLoader);//加载自定义loader luaEnv.DoString("require 'fish'");//搜寻lua脚本 }
自定义Loader需要传入一个文件路径再返回读取到的文件的byte数组
private byte[] MyLoader(ref string filePath) { string absPath = @"E:\app\unity2018\products\FishXlua\" + filePath+".lua.txt"; return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath)); }
最后的释放资源分两部分,一个是释放方法委托,一个是解释器,前者在OnDisable中调用lua代码来执行,后者在OnDestroy中来释放
void OnDisable() { luaEnv.DoString("require 'fishDispose'"); } void OnDestroy() { luaEnv.Dispose(); }
如何使用lua代码对游戏内容进行更改?
在原来的可能出问题的C#类上打上hotfix标签,在方法上打上luacallcsharp标签
之后便可在lua脚本中进行更改
修改格式如下:
xlua.hotfix(CS.类名,'方法名',function(self)
具体实现的方法体
end)
PS:当在lua脚本中可能需要用到某个c#类中的私有访问属性字段时,可以使用以下格式来获取访问权限
xlua.private_accessible(CS.类名)
调用C#中的一些自带的类、方法
CS.UnityEngine、CS.类名.方法……
通过自身对象调用自身方法:self:方法名() 或者 self.方法名(self) 前者使用冒号的方式是为了简写传入self参数的过程
解绑委托:专门用一个lua脚本来负责解绑所有lua调用重写过的方法
例如:xlua.hotfix(CS.类名,'方法名',nill)
与改写方法类型,只是在最后一个参数将function改成了nill表示置空
总结一下使用xlua热更新的开发过程:
- 首先开发业务代码
- 在所有可能出现问题的类上打上hotfix标签,在所有lua调用C#的方法上打上luacallcsharp标签,在所有csharp调用lua的方法上打上csharpcalllua标签
- 打包发布
- 修改bug时只需要更新lua文件,修改资源时只需要更新AB包,用户只需要去下载AB包和lua文件就可以了