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文件夹下的srceditor文件夹下


关于XLua的使用:

xlua在项目中的启动、调用、结束等全过程:

我们使用一个脚本来管理xlua的流程  HotfixScript

脚本中创建一个唯一的解释器 new LuaEnv()

加载自定义loader AddLoader()

搜寻并执行lua文件 Dostring(" require 'lua文件名' ")

  1. private LuaEnv luaEnv;
  2.  
  3. void Awake()
  4. {
  5. luaEnv = new LuaEnv();//创建解释器
  6. luaEnv.AddLoader(MyLoader);//加载自定义loader
  7. luaEnv.DoString("require 'fish'");//搜寻lua脚本
  8. }

自定义Loader需要传入一个文件路径再返回读取到的文件的byte数组

  1. private byte[] MyLoader(ref string filePath)
  2. {
  3. string absPath = @"E:\app\unity2018\products\FishXlua\" + filePath+".lua.txt";
  4. return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
  5. }

最后的释放资源分两部分,一个是释放方法委托,一个是解释器,前者在OnDisable中调用lua代码来执行,后者在OnDestroy中来释放

  1. void OnDisable()
  2. {
  3. luaEnv.DoString("require 'fishDispose'");
  4. }
  5.  
  6. void OnDestroy()
  7. {
  8. luaEnv.Dispose();
  9. }

如何使用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文件就可以了

Unity3D|-XLua热更新用法的大致流程的更多相关文章

  1. XLua热更新用法全流程总结(所有容易出问题的点)

    Xlua热更新流程总结 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创 ...

  2. 深入理解xLua热更新原理

    热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...

  3. [XLua]热更新四部曲视频教程+示例源码

    基于Unity2017 xLua是由腾讯维护的一个开源项目,xLua为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用.自20 ...

  4. Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介

    热更新 天下武功,无坚不破,唯快不破 热更新就是为了更快的把内容推到用户手中. 之前,我设计了C#Light,经过半年多的持续修补,勉强可用,磕磕绊绊.感谢那些,试过,骂过,用过的朋友,在你们的陪伴下 ...

  5. Unity3d dll 热更新 基础框架

    APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + v ...

  6. xLua热更新插件

    一.xLua插件下载安装 1.从GitHub上搜索并下载插件 2.将文件复制到unity中 3.检查是否有错误 二.在unity中调用lua 1.简单调用 在c#脚本中使用LuaEnv类可以运行lua ...

  7. Unity3D热更新方案网摘总结

    参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/ ...

  8. 深入理解xLua基于IL代码注入的热更新原理

    目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...

  9. Unity3D热更新全书-何谓热更新,为何热更新,如何热更新

    首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...

随机推荐

  1. [Javascript]网页链接加上时间戳防止串用户

    最近客服来报,一批用户访问公司网站的时候,由于其网络环境有代理服务器,导致A用户看到B用户的信息,这是非常尴尬的事情.解决的方法也很容易,给网址加上时间戳就可以了,用JS就能实现. JS代码如下 // ...

  2. [py]资源搜集

    python在线内存图 我会把一些好的py book的资源放到这里 来源: https://piaosanlang.gitbooks.io/spiders/10day/README10.html Le ...

  3. CentOS 7 部署GitLab

    GitLab概述 : 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过 Web 界面进行访问公开的戒者私人项目.Ruby on Rails 是一个可以 ...

  4. SQL 一列数据整合为一条数据

    SQL 一列数据整合为一条数据: SELECT  STUFF(( SELECT distinct  ',' + 列名 FROM 表名 where  [条件] FOR XML PATH('') ), 1 ...

  5. python headers missing

    系统环境 win7 64 bit,cygwin,Gvim8.1 问题 Gvim通过插件管理器Vundle下载好了YouCompleteMe插件的全部文件. 利用cygwin 进入在YouComplet ...

  6. zw版足彩大数据&报价

    zw版足彩大数据&报价 ::zw增强版足彩大数据,文件名后缀是'.dat' ::文件格式是标准文本格式,逗号分隔 ::zw增强版,在标准版赔率基础上,增加了倒数.比率两组归一化数据 ::zw版 ...

  7. Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法

    在终端通过pip装好包以后,在pycharm中导入包时,依然会报错.新手不知道具体原因是什么,我把我的解决过程发出来. pip install 解决方案一: 在Pycharm中,依次打开File--- ...

  8. Atom以及amWiki个人维基安装设置

    amWiki个人维基 amWiki支持.md文件的静态维基系统 安装 参考 安装Atom 下载amWiki解压zip到C:\Users\用户名\.atom\packages 目录下,或在Atom中搜索 ...

  9. 字符串Contains匹配失效

    参考博客:https://blog.csdn.net/lewky_liu/article/details/79353151 在编码过程中发现一个很神奇的事情,使用String.contains方法失效 ...

  10. EXCEL 如何实现下拉填充公式,保持公式部分内容不变,使用绝对引用

    EXCEL 如何实现下拉填充公式,保持公式部分内容不变,使用绝对引用 在不想变的单元格前加$符号(列标和列数,两个都要加$),变成绝对引用,默认情况是相对引用 L4固定不变的方式:$L$4 M4固定不 ...