前言

前面铺垫了这么久,终于要开始写热更新了。

Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。

资源更新是Unity本来就支持的,在各大平台也都能用。而脚本的热更新在iOS平台则是不被允许的(除了Lua)。

为了让一套代码能在各个平台都支持热更,将游戏的业务逻辑全面Lua化,是一种解决方法。这也是ToLua在做的事。

关于Unity热更与平台的关系 可以阅读陈嘉栋大佬的文章:谁偷了我的热更新?Mono,JIT,iOS

一、热更新的原理

1、热更新的简单理解

   手机App的更新方式有两种。

  第一种是全量更新。每一次App更新,开发者都需要上传一个完整的软件包(apk、ipa)到分发平台,而用户也需要下载一个完整的新软件包来重新安装。这对用户来说很不友好,对开发者更不友好。

  因为开发者上传到平台后,还需要等待平台的漫长审核,特别是iOS平台(短则两天,长则十天半月),很是影响游戏的版本计划。

  因此第二种更新方式就出来了。

  第二种是增量更新,每次更新,开发者上传本次更新的内容到资源服务器上,用户的App客户端也只用更新本次新增内容就行,无需重新下载App。

  看似很完美的方式,并且在端游上也是成熟的操作,但是这样的方式因为更新内容不可控,被苹果给禁止了(Lua是苹果留的一个口子)。

2、热更新原理详解

(因为我个人对此框架的理解还仅限于使用阶段,并不能很好的阐述其原理。为避免误导,现直接将我学习此框架时所看的文章对于此原理的解释直接引用过来。)

原文链接:https://zhuanlan.zhihu.com/p/21386682

以下两条分隔线之间的内容都是引用:


如下图所示,Unity3D的热更新会涉及3个目录。

                                                      热更新的过程图

游戏资源目录:里面包含Unity3D工程中StreamingAssets文件夹下的文件。安装游戏之后,这些文件将会被一字不差地复制到目标机器上的特定文件夹里,不同平台的文件夹不同,如下所示(上图以windows平台为例)

Mac OS或Windows:Application.dataPath + "/StreamingAssets";
IOS: Application.dataPath + "/Raw";
Android:jar:file://" + Application.dataPath + "!/assets/";

数据目录:由于“游戏资源目录”在Android和IOS上是只读的,不能把网上的下载的资源放到里面,所以需要建立一个“数据目录”,该目录可读可写。第一次开启游戏后,程序将“游戏资源目录”的内容复制到“数据目录中”(步骤1,这个步骤只会执行一次,下次再打开游戏就不复制了)。游戏过程中的资源加载,都是从“数据目录”中获取、解包(步骤3)。不同平台下,“数据目录”的地址也不同,LuaFramework的定义如下:

Android或IOS:Application.persistentDataPath + "/LuaFramework"
Mac OS或Windows:c:/LuaFramework/
调试模式下:Application.dataPath + "/StreamingAssets/"
注:”LuaFramework”和”StreamingAssets”由配置决定,这里取默认值

网络资源地址:存放游戏资源的网址,游戏开启后,程序会从网络资源地址下载一些更新的文件到数据目录。

这些目录包含着不同版本的资源文件,以及用于版本控制的files.txt。Files.txt的内容如下图所示,里面存放着资源文件的名称和md5码。程序会先下载“网络资源地址”上的files.txt,然后与“数据目录”中文件的md5码做比较,更新有变化的文件(步骤2)。

files.txt

LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs,真正用到项目时可能还需少许改动。


个人理解:

  游戏资源目录: 是游戏的安装目录。如果在是Unity里直接运行,应该指的就是Assset/StreamingAssets目录;

  如果是打包成exe程序,应该是exe程序里的某个目录(猜的,没验证)

数据目录:因为游戏资源目录不可写,因此程序又额外开辟的一个能读写的目录,就是数据目录。

网络资源地址:这个说的就是服务器资源目录了。

  

二、热更服务器搭建

  从上文了解下,要实现热更新功能,一个用于存放网络资源的服务器是必须的。我这里选用Tomcat来做服务器(任何其它能提供网络访问服务的服务器都可以)。

下载并安装Tomcat

  1)下载Tomcat

  版本:Tomcat9.0 windows平台64位版,下载地址:https://tomcat.apache.org/download-90.cgi

  

  2)下载JDK

  jdk版本1.8或以上(这个版本根据Tomcat的需求来,如果使用其它版本Tomcat,则可能需要其它版本的jdk)

  下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  3)环境变量配置

  Tomcat下载之后,无需安装,解压到指定目录即可。

  JDK下载之后,执行安装程序,直到结束。

  为了让Tomcat能正常运行,需要配置环境变量,我配置了如下四项。

  用户变量里加这两个:

  JAVA_HOME:F:\ProgramsDirectory\Java\jdk1.8

  CATALINA_HOME: I:\apache-tomcat-9.0.22

  系统变量Path里添加这两个目录:

  F:\ProgramsDirectory\Java\jdk1.8\bin

  I:\apache-tomcat-9.0.22\bin

  请参照自己的实际目录进行调整,这里不提供详细的配置方法,我这个也不是标准配法。有问题请善用搜索。

  4)运行Tomcat

  环境变量配置完成之后,执行apache-tomcat-9.0.22\bin目录下的startup.bat文件。

  看到http-nio-8080之类的字样,表示服务器已经运行,如下图。

  

  (我这里不知道为啥乱码了,明明没有中文及空格等不合规目录,不过不影响使用)

  在浏览器里输入:http://localhost:8080/ ,看到如下页面,表示Tomcat启动成功。

  

  

  本篇就讲到这里,后边就要讲怎么实现代码及资源更新了。

  晚安!

Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建的更多相关文章

  1. Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 中,我介绍了热更新的基本原理,并且着手搭建一台服务器. 本篇就做一个实战练习,真正的来实现热 ...

  2. Unity3D热更新之LuaFramework篇[10]--总结篇

    背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...

  3. Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件

    在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...

  4. Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板

    在上篇文章 Unity3D热更新之LuaFramework篇[01]--从零开始 中,我们了解了怎么获得一个可用的LuaFramework框架. 本篇将我会先介绍一下如何配置Lua开发环境,然后分析在 ...

  5. Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...

  6. Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween

    在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...

  7. Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法

    时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一. ...

  8. Unity3D热更新之LuaFramework篇[01]--从零开始

    前言 因工作关系,需要对手头的项目进行热更新支持.了解后发现,Lua的几个变种:XLua.ToLua(原uLua)和Slua都可以做Unity热更,而ToLua更是提供了一个简易的热更框架--LuaF ...

  9. Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的

    前言 用c#开发的时候,新建的脚本都默认继承自Monobehaviour, 因此脚本才有了自己的生命周期函数,如Awake,Start, Update, OnDestroy等. 在相应的方法中实现游戏 ...

随机推荐

  1. SpringCloud-分布式配置中心【加密-对称加密】

      前面我们介绍了SpringCloud的分布式配置中心,我们将项目中的配置信息保存在git或者码云的仓库中,但是这样一些敏感信息就暴露出来了,比如数据库连接的账号密码等信息,这时我们最好能够对这些信 ...

  2. Dynamics 365 Document Management

    Dynamics CRM中的Document Management功能需要Dynamics CRM与SharePoint进行集成,也就是实现在CRM中上传Document,实际上Document最终存 ...

  3. Netty源码分析--初始化Options,添加处理器(四)

    接上篇,我们继续进入AbstractBootstrap类的 initAndRegister() 方法 进入init()方法 设置父级Channel的options, 进入到上节提到的NioServer ...

  4. Centos7 fstab盘符挂载硬盘导致重启系统失败解决办法

    服务器拥有多个硬盘插槽,在进行维护或重启时,这些硬盘的相对位置可能发生变化.利用盘符(dev/vda)方式挂载磁盘,可能由于磁盘顺序变化导致重启时读取fstab文件发生错误,从而无法正常重启服务器. ...

  5. C#常用设计模式--单例模式

    为什么要使用单例模式 在我们的整个游戏生命周期当中,有很多对象从始至终有且只有一个.这个唯一的实例只需要生成一次,并且直到游戏结束才需要销毁.  单例模式一般应用于管理器类,或者是一些需要持久化存在的 ...

  6. 简单DI

    <?php class DI { private $container; public function set($key, $obj, ...$args) { $this->contai ...

  7. 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

    目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...

  8. IPv6 优于 IPv4 的十大功能

    现在是 9102 年,有一个严重的问题,困扰着资深宅男二狗子.那就是偶像团体没新名了.今年开始,偶像团体 XKB48 已经在无法取更多的新名字了,排列组合的所有方式都已经经过了历史长河的洗礼,除非偶像 ...

  9. DBA主宰一切请求,MySQL 查询重写

    这个功能一年左右之前就以知晓,应该是5.7的高版本中.今天难得有兴致测试.随之也就总结一下. 前言: 一般来说,我们都会让开发自己去改sql.这样需要重启应用,单节点不可避免有或多或少的停服时间.同事 ...

  10. UESTC 1324:卿学姐与公主(分块)

    http://acm.uestc.edu.cn/#/problem/show/1324 题意:…… 思路:卿学姐的学习分块例题. 分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把 ...