前言

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

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. php PAC 安装

    LIUNX wget http://pecl.php.net/get/APC-3.1.8.tgz tar -zxvf APC-3.1.8.tgz cd APC-3.1.8 /usr/local/php ...

  2. C语言实现常用数据结构——图

    #include<stdio.h> #include<stdlib.h> #define SIZE 20 #define LENGTH(a) (sizeof(a)/sizeof ...

  3. AI行为树的工作原理

    很久没写博客了,最近在项目刚部署到测试服,需要进行压测,老大相当专业的用了行为树来组织压测机器人的代码,这段时间陆陆续续在网上看了不少关于行为树的文章,其中有一篇我觉得写得非常到位,它原文是英文,链接 ...

  4. 点菜网---Java开源生鲜电商平台-技术选型(源码可下载)

    点菜网---Java开源生鲜电商平台-技术选型(源码可下载) 1.内容简介 点菜网目前选用的是最流行的微服务架构模式,采用前后端分离的开发模式,具备高可用,高负载,支持千万级别的数据量的请求. 2. ...

  5. meta 详解

    对meta标签用处的介绍,meta常用于定义页面的说明,关键字,最后修改日期,和其它的元数据.这些元数据将服务于浏览器(如何布局或重载页面),搜索引擎和其它网络服务. 组成 meta标签共有两个属性, ...

  6. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  7. HDU 1561:The more, The Better(有依赖的树型背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意:有n个点,容量为m,每个点有一个价值,还给出n条边,代表选第i个点之前必须先选ai,问最多的价值能取 ...

  8. JcApiHelper 简单好用的.Net ApiHelper

    一 背景 随着前端技术的不断发展,各种框架逐渐成熟,前端 Angular,React,Vue 三分天下.再加上移动端的崛起,前后端分离开发成为主流,前端后端代码混合开发的方式沦为被淘汰的局面.如今 M ...

  9. django基础知识之HTML转义:

    HTML转义 Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request): return render(request, 'temtest/in ...

  10. spring boot freemarker 导出word 带echarts图形报表

    创建word文件内容如下 将word导出为xml格式 将文件后缀名改为 .ftl 在springboot项目中添加freemarker依赖 <!-- 导出word文档--> <dep ...