Unity+XLua实现简单热更

本文介绍了如何在Unity项目中使用Xlua和Lua脚本实现热更功能,包括通过ScriptedImporter处理Lua文件,检查服务器资源更新并进行MD5校验。文章详细描述了编辑器脚本如何生成AB资源清单和检测资源差异,以及更新资源的过程。
摘要由CSDN通过智能技术生成

热更

游戏热更新指的是不需要用户重新下载安装包而是下载游戏内资源的方式就能达到修复游戏bug或增加游戏逻辑的技术。

项目使用Xlua插件,使用Lua脚本作为游戏逻辑代码,并通过自定义ScriptedImporter实现了Unity对.Lua文本的识别。
思路:游戏主场景包含热更新代码+启动lua逻辑的代码。热更部分代码包含读取远程服务器的AB资源清单,并判断是否存在该包并判断MD5值是否一致。若不存在或MD5不一致则重新去服务器上重新下载。下载完毕之后就启动lua逻辑,执行游戏逻辑。

缺点:由于只有在进入游戏时才更新所以并不适用于大型联机在线游戏,但对单机类游戏足够了。

实现

通过hfs搭建本地Http服务器,将ab包和清单文件放入其中。
经过测试第一次访问时正常下载资源文件,且删除或更改文件后也可以自动修复。

编辑器脚本主要实现一键生成AB资源包清单和Md5值。


public class BuildMD5Class : Editor
{
    static string rootPath = "AssetBundles";

    [MenuItem("Pack/BuildMD5")]
    static void BuildMD5() {
        //遍历文件计算md5,并生成清单。
        string[] names = Directory.GetFiles(rootPath);
        ABFileManifest abfm = new ABFileManifest();
        abfm.BuildID = 1;
        abfm.files = new ABFileInfo[names.Length];

        for (int i = 0; i < names.Length; i++)
        {
            var temp = names[i].Split("\\");
            string name = temp[temp.Length - 1];
            //c#内置了MD5相关逻辑,这里我只是封装了下
            var md5Hash = MD5Util.GetMD5(names[i]);
            abfm.files[i] = new ABFileInfo(name, md5Hash);
        }
        string json = JsonUtility.ToJson(abfm);
        Debug.Log(json);
        FileStream abfs = File.Create(rootPath + "/AAA-ABMd5.json");
        StreamWriter sw = new StreamWriter(abfs, Encoding.UTF8);
        sw.Write(json);
        sw.Flush();
        sw.Close();
        abfs.Close();
    }

入口函数,主要完成判断是否有文件需要更新。

   public void Start()
    {
        ABFileInfo[] infos = CheckAB();

        if (infos == null)
        {
            StartGame();
        }
        else {
            string text = string.Format("本次更新{0}个文件",infos.Length); 
            mainCanvas.ShowLoadPanel(text);
        }
    }

检测本地资源和服务器资源是否有不一致的文件。

  public ABFileInfo[] CheckAB()
    {
        string rootPath = Application.persistentDataPath;
        ABFileInfo[] result;
        bool flag = false;
        //每次登录访问服务器的文件列表
        LoadFromServer(httpUrl + "/AAA-ABMd5.json", rootPath + "/AAA-ABMd5.json");
        FileStream abfs = File.OpenRead(rootPath + "/AAA-ABMd5.json");
        StreamReader sr = new StreamReader(abfs, Encoding.UTF8);
        string json = sr.ReadToEnd();
        sr.Close();
        abfs.Close();
       

        ABFileManifest abfm =  JsonUtility.FromJson<ABFileManifest>(json);

        result = new ABFileInfo[abfm.files.Length];
        int index = 0;
        for (int i = 0; i < abfm.files.Length; i++) {
            ABFileInfo ABInfo =  abfm.files[i];
            //由于在生成时清单文件和AB包文件在同一个目录,就有可能导致清单文件的MD5值永远和记录中的不一样(计算MD5在前,写入文件在后),可以将清单文件生成在不同目录或过滤掉该文件。这里就可以删掉
            if (ABInfo.name.Equals("AAA-ABMd5.json"))
            {
                continue;
            }

            string targetName = rootPath +"/"+ ABInfo.name;
            byte[] md5Hash = MD5Util.GetMD5(targetName);

            //如果不存在该文件或md5值不一样 就记录
            if (md5Hash == null  || ! MD5Util.CheckMd5(md5Hash, ABInfo.md5) ) {
                result[index] = ABInfo;
                index++;
                flag = true;
            }
        }
        if (flag) {
            ABFileInfo[] temp = new ABFileInfo[index];
            Array.Copy(result, temp, index);
            result = temp;
            return result;
        }
        return null;
    }

更新资源文件


 public void HotLoad() {
        ABFileInfo[] infos = CheckAB();
        if (infos == null)
        {
            StartGame();
        }
        else
        {
        
            foreach (var item in infos)
            {
                string targetName = rootPath + "/" + item.name;
                LoadFromServer(httpUrl+"/" + item.name, targetName);
            }
            // 
            HotLoad();
        }
    }
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值