Unity客户端实现远程在线更新

前言

小编目前工作是大屏数据可视化,由于都是单点本地部署,版本统一和更细就成为了一个需要解决的问题,于是在跟后端同事的共同谈论下,完成了远程在线更新的功能,下面将实现逻辑和主要代码分享给大家

功能可以实现,但不一定是最优解,有更优解法的大佬也烦请友情指出,谢谢!!

实现逻辑

每次登录前,接口请求后台管理的版本号,如果与本地版本号不同,则启动下载程序,下载线上最新包。

1、工程中添加版本号管理,无论是unity自带的版本号还是自己添加

 2、接口请求后台最新版本号,如果与本地版本号不同,则启动下载程序,关闭当前程序,具体实现逻辑要与后端同事配合

3、新建控制台程序,右键工程,选择”管理NuGet程序包“,在浏览中引入SharpZipLib,线上的包只能是zip格式压缩包

 

4、引入System.Net,使用webClient,下载URL中的资源

/// <param name="url">下载路径</param>
/// <param name="saveFilePath">保存路径,带文件名称及后缀名</param>
static void LoadZip(string url, string saveFilePath)
{
    Console.WriteLine("下载软件包...");
    using (WebClient wc = new WebClient())
    {
         ServicePointManager.Expect100Continue = true;
         ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
         ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
         wc.DownloadProgressChanged += wc_DownloadProgressChanged; // 下载中,可获取到下载进度
         wc.DownloadFileCompleted += Wc_DownloadFileCompleted; // 下载完成
         wc.DownloadFileAsync(new Uri(url), saveFilePath);
    }
    Console.ReadKey();
}
/// 下载进度
static void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    Console.WriteLine("downloaded {0} of {1} bytes. {2} % complete...",
    e.BytesReceived,
    e.TotalBytesToReceive,
    e.ProgressPercentage);
}

 5、下载完成后,使用第三步中引入的SharpZipLib,将下载的zip压缩包进行解压并替换原文件

static void Wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
      Console.WriteLine("下载完成");
      UnpackFiles("文件路径,包含文件名", "文件所在文件夹路径");
}
static void UnpackFiles(string file, string dir)
{
      try
      {
          Console.WriteLine("解压文件:" + file);
          Console.WriteLine("解压到:" + dir);
          if (!Directory.Exists(dir))
          {
               Directory.CreateDirectory(dir);
          }
          Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
          Encoding gbk = Encoding.GetEncoding("gbk");
          ZipInputStream s = new ZipInputStream(File.Open(file, FileMode.Open));
          ZipEntry theEntry;

          while ((theEntry = s.GetNextEntry()) != null)
          {
                string directoryName = Path.GetDirectoryName(theEntry.Name);
                string fileName = Path.GetFileName(theEntry.Name);
                Console.WriteLine(directoryName + fileName);
                if (directoryName != String.Empty)
                {
                    Directory.CreateDirectory(dir + directoryName);
                }
                if (fileName != String.Empty)
                {
                    FileStream streamWriter = File.Create(dir + theEntry.Name);
                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true)
                    {
                        size = s.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    streamWriter.Close();
                }
          }
          s.Close();
          if (File.Exists(file))
          {
              File.Delete(file);//覆盖后,删除无用的压缩包
          }
          Console.WriteLine("更新完成");
          System.Environment.Exit(0);//关闭自己
          Console.ReadKey();
    }
    catch (Exception e)
    {
        Console.WriteLine("错误:" + e.ToString());
        throw;
    }
}

6、解压完成后,控制台程序会自动关闭,之后打开unity程序即可完成在线更新

博主有一些实用的Unity插件,请到【https://gitee.com/jacobkay】中的查看,感谢支持

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity gRPC 是 Unity 引擎中一种基于 Google 的开源通信协议 gRPC 的插件。gRPC 是一种高性能、跨语言远程过程调用(RPC)框架,它允许在不同平台和语言之间进行快速、高效的通信。 Unity gRPC 提供了一种可靠、高效的方法,用于 Unity 应用程序与其他远程服务器或服务进行通信。它支持跨平台的协议缓冲区(Protobuf),这意味着可以通过定义消息的结构和服务之间的接口来轻松地生成通信代码。这使得开发人员可以专注于应用程序的逻辑,而不需要手动处理底层的网络通信细节。 Unity gRPC 还内置了对 HTTP/2 协议的支持,这是一种先进的协议,可以提供更快、更高效的网络传输。它还支持双向流式传输,使得客户端和服务器可以同时发送和接收消息,提供更灵活的通信方式。 Unity gRPC 的使用可以带来许多好处。首先,它可以加快应用程序的开发速度,减少开发工作量,因为大部分的底层通信逻辑已经由 gRPC 框架处理。其次,它提供了一种可靠的通信方式,确保消息的完整性和可靠性。此外,由于使用了网络流式传输,Unity gRPC 还适用于需要处理大量数据的应用场景,如实时游戏、多媒体传输等。 总而言之,Unity gRPC 是一种强大的通信工具,可以为 Unity 开发人员提供方便、高效和可靠的数据传输方式,帮助他们构建更具交互性和实时性的应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值