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

xlua热更新简单demo

[复制链接]
发表于 2021-8-11 10:00 | 显示全部楼层 |阅读模式
1.参考资料

参考视频教学
环境下载
2.实现的内容

点击鼠标生成一个立方体,然后用xlua热更新,使得其点击鼠标能生成一个球体
3.环境安装

从github下载xlua的开发框架,然后把框架Assets里面的内容复制到自己新建的工程的Assets目录下,然后复制Tools里面的内容到根目录。
设置Player Setting里面的Scripting Define Symbols的值为HOTFIX_ENABLE
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbIw03Zh-1586317505950)(en-resource://database/1495:0)]
4.实现步骤

4.1完成基础功能

1.新建一个Cube(命名为AA),然后拖到Resources文件夹(没有就新建一个)下,生成一个prefab
2.新建xluaTest脚本,修改update函数
3.打上[Hotfix]标签来支持热更新
  1. [Hotfix]
  2. public class xluaTest : MonoBehaviour
  3. {voidUpdate(){if(Input.GetMouseButtonDown(0)){
  4.             GameObject preGo = Resources.Load("AA") as GameObject;
  5.             GameObject go = GameObject.Instantiate(preGo);}}}
复制代码
3.新建一个空物体,挂载xluaTest脚本
4.2准备资源文件

因为我们需要将cube替换成sphere,然后还需要进行热更新,因此我们需要把执行热更新的lua文件以及sphere打成AB包,然后进行加载。
4.2.1.新建一个编辑器脚本进行AB打包。
  1. public class MyTools : Editor
  2. {[MenuItem("Tools/CreatBundle")]staticvoidCreateAssetBundle(){
  3.         string path ="AB";if(!Directory.Exists(path))
  4.             Directory.CreateDirectory(path);
  5. BuildPipeline.BuildAssetBundles(path,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
  6.         DateTime now = DateTime.Now;
  7.         string ver = now.ToString("yyyyMMddff");
  8.         File.WriteAllText(path+@"/version.txt",ver);
  9.         Debug.Log("finish");}}
复制代码
值得注意的是,我们还打包了一个版本信息文件,版本信息传入了当前的时间作为参数,因为加载包的时候,如果版本一样的话,工程将会在缓存中进行读取,而不会进行加载,所以每次打包需要传入不一样的值,从而使得每次都能下载新的AB包而不是从缓存中进行读取。
4.2.2 新建一个球以及一个txt文件,并打包

新建一个球体(命名为BB)以及一个txt文件(命名为demo1.lua.txt),放到Resources文件夹下面


然后编写lua脚本
脚本内容是用这个lua脚本替换xluaTest里面的Update函数
当然这里面涉及到了一个download组件,后面将进行叙述,downl组件里面的assetBundle变量存储下载的AB包
  1. xlua.private_accessible(CS.xluaTest)
  2. xlua.hotfix(CS.xluaTest,"Update",
  3. function(self)
  4.        local cc = CS.UnityEngine
  5.        if cc.Input.GetMouseButtonDown(0) then
  6.               local dGo = cc.GameObject.Find("tst")
  7.               local t = dGo:GetComponent("download").assetBundle
  8.               local obj = t:LoadAsset("BB")
  9.               local go = cc.GameObject.Instantiate(obj)
  10.               go.transform.position = cc.Vector3(5,5,5)
  11.        end
  12. end
  13. )
复制代码
接下来执行Tools->CreatBundle进行程序打包。
可以在根目录发现AB文件夹,里面内容如下:



4.3 编写download脚本

上面打包好的AB包实际上是应该放到服务器的,我们假定自己的服务器的D盘的根目录,也就是我们把上面的AB文件夹复制到D盘跟目录中,这个脚本的作用是首先读取版本号,如果版本号一样则不进行读取,否则读取新的AB包,并把AB包中的lua脚本存储到本地。
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4. public class download : MonoBehaviour
  5. {
  6.     string path = @"D:\AB\aabb.u3d";//@可以去转义字符
  7.     string pathVer = @"D:\AB\version.txt";
  8.     public AssetBundle assetBundle;
  9.     private voidAwake(){StartCoroutine(loadFile());}
  10.     IEnumerator loadFile(){
  11.         WWW wwwVersion = new WWW(pathVer);
  12.         yield return wwwVersion;if(!string.IsNullOrEmpty(wwwVersion.error)){
  13.             Debug.Log(wwwVersion.error);
  14.             yield break;}int verValue =int.Parse(wwwVersion.text);//Caching.ClearCache();
  15.         WWW w1 = WWW.LoadFromCacheOrDownload(path, verValue);//读取版本号信息
  16.         yield return w1;
  17.         assetBundle = w1.assetBundle;
  18.         TextAsset hot = assetBundle.LoadAsset("demo1.lua.txt") as TextAsset;
  19.         string newpath = Application.persistentDataPath + @"/demo1.lua.txt";if(!File.Exists(newpath)){
  20.             File.Create(newpath);}
  21.         File.WriteAllText(newpath,hot.text);}}
复制代码
4.4 编写excuteHotfix脚本

这个脚本用来执行读取的lua脚本,lua.DoString(str)可直接传入lua脚本进行执行
  1. using UnityEngine;
  2. using XLua;
  3. using System.IO;
  4. public class excuteHotfix : MonoBehaviour
  5. {
  6.     private voidAwake(){
  7.         LuaEnv lua = new LuaEnv();
  8.         lua.AddLoader(myLoader);
  9.         lua.DoString("require'demo1'");}
  10.     public byte[]myLoader(ref string filepath){
  11.         string newpath = Application.persistentDataPath + @"/"+ filepath +".lua.txt";
  12.         string txtstring = File.ReadAllText(newpath);return System.Text.Encoding.UTF8.GetBytes(txtstring);}}
复制代码
4.5 生成以及注入代码

依次点击Xlua->Generate Code
Xlua->Hotfix Inject In Editor
把前面的Download脚本和ExcuteHotfix脚本挂到tst上,即可。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 04:28 , Processed in 0.084443 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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