您当前的位置: 首页 >  服务器

十幺卜入

暂无认证

  • 4浏览

    0关注

    119博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity3d 基于xlua热更新实现系列四(终章):构建资源服务器实现真正热更新的压缩包下载、解压和更新功能(含源码)

十幺卜入 发布时间:2022-03-30 17:45:40 ,浏览量:4

前言

上三篇,我们实现了: Unity3d 基于xlua热更新实现系列一:登录功能熟悉lua重写C# Unity3d 基于xlua热更新实现系列二:Xlua脚本动态加载(半热更新) Unity3d 基于xlua热更新实现系列三:生成AB包导出并实现AB包动态加载(资源半热更改) 探索了,资源更新和逻辑脚本等功能。完整热更新在本文推出,时间花的有点久,主要还是因为更新界面打算用xlua编写的,可是编写了一半放弃了,实在是不顺手啊(任重道远~~~),最后纯C#编写了更新检测、资源下载、解压更新等功能。

效果

在这里插入图片描述

资源服务器

资源服务器的搭建我是比较从简的方式直接使用了IIS,按如下的方式进行配置: 在这里插入图片描述

在E盘新增了HotUpdateServer目录,设置为服务器的根目录。 在下面新建了ResVers文件夹,用于存放更新的内容。versions.json文件是版本的描述文件,用于检查更新时访问。

{
	"versions": [
		{
			"ver": "1.0",
			"url": "http://127.0.0.1:5544/ResVers/Ver1.0.zip",
			"content": "基础版本的更新内容"
		},
		{
			"ver": "1.1",
			"url": "http://127.0.0.1:5544/ResVers/Ver1.1.zip",
			"content": "更新了登录界面的面板文字,更新了登录场景的的模型运动,"
		}
	]
}
更新功能

更新功能是程序运行的第一个功能,先检查更新,根据本地资源的版本号请求服务器资源,有更新时开始下载资源,下载完成一个资源更新本地的资源同时更新本地版本号,直到资源是服务器最新版本的资源。

搭建UI

按如图的形式搭建更新界面的UI: 在这里插入图片描述

主要的内容是:上面的更新内容的描述 和下方的更新进度UI。

检查更新

本地使用了一个version.json文件记录本地的版本信息:

{"version":"1.1"}

检查更新时我们先读取本地资源版本,再请求服务器资源版本。

 //检查版本
    IEnumerator CheckVersions()
    {
        WebReq = UnityWebRequest.Get(VerChkUrl);
        isProc = true;
        WebReq.SendWebRequest();
        if (WebReq.isNetworkError || WebReq.isHttpError)                                                            
        {
            Debug.Log(WebReq.error); 
        }
        else
        {
            while (!WebReq.isDone) 
            {
                if (WebReq.downloadProgress != 0)
                    yield return 0;
            }
            if (WebReq.isDone) 
            {
                JsonData data = JsonMapper.ToObject(WebReq.downloadHandler.text);
                if (data.ContainsKey("versions") && data["versions"] != null && data["versions"].IsArray)
                {
                    VersionList.Clear();
                    for (int i = 0; i  0)
                    if (!Directory.Exists(directoryName))
                        Directory.CreateDirectory(directoryName);
                if (fileName != String.Empty)
                {
                    using (FileStream streamWriter = File.Create(filePath))
                    {
                        int size = 2048;
                        byte[] data = new byte[2048];
                        while (true)
                        {
                            size = stream.Read(data, 0, data.Length);
                            if (size > 0)
                                streamWriter.Write(data, 0, size);
                            else
                                break;
                        }
                        streamWriter.Close();
                        streamWriter.Dispose();
                    }
                }
                yield return 0;
            }
            stream.Close();
            stream.Dispose();
            File.Delete(spath);
            SetVersion(verinfo.ver);
        }
        TipText.text = "解压资源完成!";
        if (idx 5)then
	    MoveUp = false
	elseif(cubeObj.transform.localPosition.y             
关注
打赏
1663314737
查看更多评论
0.1031s