找回密码
 立即注册
查看: 479|回复: 0

Unity3D 从打包到热更,超简单的XLua运用一条龙

[复制链接]
发表于 2021-8-22 08:41 | 显示全部楼层 |阅读模式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。      本文链接:   https://blog.csdn.net/Mr_Sun88/article/details/87997055


               Unity3D 从打包到热更,超简单的XLua运用一条龙




目录

1、博客介绍
2、XLua环境配置
3、场景搭建和AB包的准备
(1)场景搭建
(2)Lua脚本准备
(3)AB包的准备
4、基础网络环境的搭建
5、热更新的测试
6、资源包下载
7、推送
8、结语


1、博客介绍

       博主也是刚接触XLua不久,本篇博客主要起记录和学习的作用,在本篇博文当中将介绍Xlua的配置和使用,对于萌新和小白来说应该还是有点用处的,大佬就绕道吧。

2、XLua环境配置

关于Xlua的配置在网上有很多文章,很简单,这里在阐述一下。
首先在github上下载XLua的源码工程


将源码Assets目录下的所有文件移动到你自己Unity工程Assets目录下


将源码内和Assets同级的Tools文件全部移动到你自己Unity工程目录下,和你的Assets保持同级


将本地Unity目录下的\Editor\Data\Managed下的Unity.Cecil.dll、Unity.Cecil.Mdb.dll、Unity.Cecil.Pdb.dll三个文件复制到项目中的\Assets\XLua\Src\Editor文件夹下


最后一步,在Unity内File--Bulid Settings-Player Settings-Other Settings-Scripting define Symbols 打开HOTFIX_ENABLE


       输入后,敲击回车,待右下角的圆圈加载完后就可以了,然后测试是否成功,点开编辑器上XLua选项,点击Clear Generated Code ,然后点击Generated Code在右下角加载完成后,点击Hotfix inject in Editor。然后打开XLua的地8个例子HotfixTest,运行后点击左上角HotfixTest,输出变为Lua输出,既成功。





3、场景搭建和AB包的准备

这里不知道怎么制作打包工具的请跳转博主上一篇博客
传送门:https://blog.csdn.net/Mr_Sun88/article/details/86553465
(1)场景搭建

这里我们做一个非常简单的工程,一个Cube和一个Sphere,两个按钮


然后设置脚本Test.cs,并挂载在场景内,脚本给两个按钮绑定好方法,方法不做任何处理



  • using System.Collections;   



  • using System.Collections.Generic;   



  • using UnityEngine;   



  • using UnityEngine.UI;   



  • using XLua;   











    ///<summary>



    /// Test



    /// Date:2019/3/1



    /// Author:Mr.Sun



    ///</summary>



  •      [     Hotfix]   



  • publicclassTest :      MonoBehaviour



  •      {   



    ///<summary>



    /// 方块预制体



    ///</summary>



  • public Transform Cube;   



    ///<summary>



    /// 圆球预制体



    ///</summary>



  • public Transform Sphere;   



    ///<summary>



    /// 按钮1



    ///</summary>



  • public Button BtnOne;   



    ///<summary>



    /// 按钮2



    ///</summary>



  • public Button BtnTwo;   











    // Use this for initialization



  • voidStart () {   







  •                      BtnOne.onClick.AddListener(OnClickOne);   



  •                      BtnTwo.onClick.AddListener(OnClickTwo);   







  •              }   







    // Update is called once per frame



  • voidUpdate () {   







  •              }   







    ///<summary>



    /// 按钮一点击方法



    ///</summary>



  •              [     LuaCallCSharp]   



    privatevoidOnClickOne()



  •              {   







  •              }   







    ///<summary>



    /// 按钮二点击方法



    ///</summary>



  •              [     LuaCallCSharp]   



    privatevoidOnClickTwo()



  •              {   







  •              }   



  •      }   


       这里注意了啊,如果想要使用XLua进行热更新,你想要在修改的类前面必须打上标签----->[Hotfix]<-------,在想要修改的方法前必须打上标签------->[LuaCallCSharp]<-------,这些工作都是你在发布前做好的,在你觉得需要热更的地方都打好标签。
(2)Lua脚本准备

下一步我们先用Lua把方法重写一下,点击按钮一破坏掉Cube,点击按钮二破坏掉Sphere。



  • local UnityEngine=CS.UnityEngine   



  •      xlua.hotfix(CS.Test,     'OnClickOne',     function(self)



  • UnityEngine.     Object.     Destroy(self.Cube.gameObject)



  • end)   











  • xlua.     hotfix(CS.Test,'OnClickTwo',function(self)



  • UnityEngine.     Object.     Destroy(self.Sphere.gameObject)



  • end)   


新建一个txt的文本文件,命名为Load.lua,重写方法就按照上面的格式
xlua.hotfix(cs.类名,‘方法名’,function(self))
-------------方法体--------------
end)
这里有一点需要注意,你重写方法后,在关闭客户端的时候必须释放掉,要不然会报错,写法如下:






  •      xlua.hotfix(CS.Test,     'OnClickOne',     nil)   







  •      xlua.hotfix(CS.Test,     'OnClickTwo',     nil)   


新建一个txt文本,命名为Dispose.lua,格式如下
xlua.hotfix(cs.类名,‘方法名’,nil)
好了现在Lua脚本分别就是,Load.lua.txt 和 Dispose.lua.txt两个文件。
(3)AB包的准备

下面我们将两个txt设置好Assetbudnle的名称和后缀




好了,现在Lua脚本都在AB包内了,对打包流程还有疑问的请移步博主上一篇文章。

4、基础网络环境的搭建

我们这里使用了一个叫做NetBox的软件来模拟网络环境,该软件运行后效果如图


既该软件的同级目录的地址就是http://localhost/+.......,如此我们就可以模拟网络环境了,我们把刚打包好的AB包放在和NetBox的同级目录下。


下面我们写加载Lua的脚本



  • using System.Collections;   



  • using System.Collections.Generic;   



  • using System.IO;   



  • using UnityEngine;   



  • using UnityEngine.Networking;   



  • using XLua;   











    ///<summary>



    /// Test



    /// Date:2019/3/1



    /// Author:Mr.Sun



    ///</summary>



  • publicclassLoadLua :      MonoBehaviour {   







  • private LuaEnv _luaEnv;   



    ///<summary>



    /// AB包



    ///</summary>



  • private AssetBundle ab;   



    ///<summary>



    /// 加载Lua文件并执行



    ///</summary>



    privatevoidAwake()



  •              {   



  •                      _luaEnv =      new LuaEnv();   



  •                      StartCoroutine(LoadABPackage6(     "Load"));   







  •              }   







    ///<summary>



    /// 释放lua方法



    ///</summary>



    privatevoidOnDisable()



  •              {   



  •                      StartCoroutine(LoadABPackage6(     "Dispose"));   



  •              }   







    ///<summary>



    /// 释放Lua虚拟机



    ///</summary>



    privatevoidOnDestroy()



  •              {   



  •                      _luaEnv.Dispose();   



  •              }   







    IEnumerator LoadABPackage6(string fileName)



  •              {   



  •                      UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(     @"http://localhost/"+     "luascripts.unity.assetbundle");   



  • yieldreturn request.Send();   



  •                      ab = (request.downloadHandler      as DownloadHandlerAssetBundle).assetBundle;   



  •                      TextAsset ta = ab.LoadAsset(fileName+     ".lua.txt")      as TextAsset;   



  •                      _luaEnv.DoString(ta.text);   



  •              }   







  •      }   


       该脚本同样是挂载在主场景上,加载方法,在博主上一篇关于AB包的加载方式内都有详细介绍,如果补丁内存在对应的重写方法,XLua会优先运行我们用Lua重写的方法,而不会再运行我们在原C#内写的方法。

5、热更新的测试

       现在我们可以先运行一下NetBox,然后运行场景进行测试,记得凡是修改了C#脚本后都需要点击上方编辑栏的XLua按钮,Clear一下代码,在Genetrate Code,在Hotfix Inject In Editor一下。


可以,我们在Lua中写的方法已经生效了,下面我们把场景打包再次测试。


同样没问题,这样我们就可以直接通过服务器上的AB包来修改我们的代码了。

6、资源包下载

本篇博客所用软件和工程源码:
https://download.csdn.net/download/mr_sun88/10991047

7、推送

先空着

8、结语

       本篇博客呢,只是很基础的介绍了一下有关使用XLua热更新的方法,主要起一个记录的作用,希望能对各位同学也有所帮助,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
       QQ交流群:806091680(Chinar)
       该群为CSDN博主Chinar所创,推荐一下!我也在群里!
     本文属于原创文章,转载请著名作者出处并置顶!!!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 14:48 , Processed in 0.089255 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表