好菜!看得好爽!|

Nyanyan

园龄:6年5个月粉丝:3关注:2

Unity安卓项目更新(下载安装包并进行安装方式)

项目上要做更新,还没学热更新,要做到游戏内部下载安装包并进行安装的效果,项目不采用Url转跳默认下载器的方式。

Url转跳下载方式

Application.OpenURL(URL);

用这个转跳你的Nginx下载路径就行了,项目上不让用这种方式

Unity内下载安装包   

应用调用安卓,安装包位置下在Application.persistentDataPath目录下,下完之后,直接unity调用安卓方法安装此目录下的安装包

 

复制代码
    /// <summary>
    /// 分段,断点下载文件
    /// </summary>
    IEnumerator BreakpointResume(string loadPath, string savePath)
    {
        //UnityWebRequest 经配置可传输 HTTP HEAD 请求的 UnityWebRequest。
        UnityWebRequest headRequest = UnityWebRequest.Head(loadPath);
        //开始与远程服务器通信。
        yield return headRequest.SendWebRequest();
        if (!string.IsNullOrEmpty(headRequest.error))
        {
            Debug.LogError("获取不到资源文件");
            yield break;
        }
        //获取文件总大小
        ulong totalLength = ulong.Parse(headRequest.GetResponseHeader("Content-Length"));
        Debug.Log("获取大小" + totalLength);
        headRequest.Dispose();
        UnityWebRequest Request = UnityWebRequest.Get(loadPath);
        //append设置为true文件写入方式为接续写入,不覆盖原文件。
        Request.downloadHandler = new DownloadHandlerFile(savePath, true);
        //创建文件
        FileInfo file = new FileInfo(savePath);
        //当前下载的文件长度
        ulong fileLength = (ulong)file.Length;
        //请求网络数据从第fileLength到最后的字节;
        Request.SetRequestHeader("Range", "bytes=" + fileLength + "-");
        if (!string.IsNullOrEmpty(Request.error))
        {
            Debug.LogError("下载失败" + Request.error);
        }
        if (fileLength < totalLength)
        {
            Request.SendWebRequest();
            while (!Request.isDone)
            {
                double progress = (Request.downloadedBytes + fileLength) / (double)totalLength;
                _Pub_Sliders[0].value = (float)progress;        // 获取下载进度显示为滑动条
                _Pub_Txts[3].text = "存储路径:" + Application.persistentDataPath + "/" + Constants.URL_PROJECT_UPDATA_APK_NAME;       // 显示存放路径//超过一定的字节关闭现在的协程,开启新的协程,将资源分段下载
                if (Request.downloadedBytes >= _pri_LoadedBytes)
                {
                    StopCoroutine("BreakpointResume");

                    //如果 UnityWebRequest 在进行中,就停止。
                    Request.Abort();
                    if (!string.IsNullOrEmpty(Request.error))
                    {
                        Debug.LogError("下载失败" + Request.error);
                    }
                    yield return StartCoroutine(BreakpointResume(loadPath, savePath));
                }
                yield return null;
            }
            if (Request.isDone)
            {
                Install.安装APK(Application.persistentDataPath + "/" + Constants.URL_PROJECT_UPDATA_APK_NAME);
            }
        }
        if (string.IsNullOrEmpty(Request.error))
        {
            _Pub_Sliders[0].value = _Pub_Sliders[0].maxValue;        // 获取下载进度显示为滑动条
            _Pub_Txts[3].text = "存储路径:" + Application.persistentDataPath + "/" + Constants.URL_PROJECT_UPDATA_APK_NAME;       // 显示存放路径
        }
        Request.Dispose();
    }
复制代码

Unity调用安卓安装安装包

参考文章

unity调用安卓方法实现安装apk文件(androidx)_chunyu90225的博客-CSDN博客

记录

各种工具版本号

Android Studio:2022.2.1

AS Gradle Plugin Version:8.0.2

AS Gradle Version:8.0

Unity:2021.3.25f1c1

Unity Gradle:6.1.1

JDK:1.8

Unity配置基本按照2021.3.25默认设置

问题

  1. AndroidStudio里面Gradle版本、Gradle Plugin版本、Unity Gradle版本这几个对打包都有很大影响
  2. 在给mainTemplate.gradle加依赖的时候自己给两个依赖直接加了“,”结果是不需要的,导致了unity打包不了

     这样就行了

本文作者:Nyanyan

本文链接:https://www.cnblogs.com/nyan/p/17554154.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Nyanyan  阅读(307)  评论(0编辑  收藏  举报
   
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起