#Unity GameFrameWork框架- Resources模块

之前的文章可能都太老了,现在已经没有Update分支了,热更新相关逻辑已经合并到主干了,验证的逻辑均来自E大的StartForce的例子,也感谢D佬的UGF的扩展和耐心解答,后面会出一个关于他ab包插件的使用

StarForce
UGF Extension
HFS本地服务器

目前主要是说下出包相关

获取资源模式
Game Framework 中,资源模式分为三种:Package(单机模式)、Updatable(预下载的可更新模式)、UpdatableWhilePlaying(使用时下载的可更新模式)。Package(单机模式):适用于单机游戏,游戏资源无需在 app 内进行更新时使用此模式。
Updatable(预下载的可更新模式):适用于中大型网络游戏,游戏资源需要在游戏主流程开始前更新完毕,以保证良好的游戏内体验。
UpdatableWhilePlaying(使用时下载的可更新模式):适用于小型网络游戏,游戏资源可以在游戏主流程进行的过程中进行更新。游戏运行过程中,遇到需要加载某个资源但该资源尚未下载时,会先去下载资源再进行加载,故此行为可能导致较差的游戏体验,不建议使用。

目前我们运行游戏的时候主要是在

但是正常打出pc 安卓包这种他是去SteamingAssets下面找对应的ab资源,所以我们需要把相关的资源打成ab包然后移到这个文件夹。
关于这点,E大也说过:

首先引入插件来打ab包,作者提供的不太好用。作者提供的可以后面来查看ab包是否打成功了。
首先要引入这些标签,这样他能通过这些标签获取数据。

然后是加入了ResourceRule扩展
加完了,可以在界面上看到

打开就可以配置了,可以通过Add或者+号来新增

记得先Save 然后同步,命令行会有打印

然后就可以开始打ab了,也是在GameFrameWork下面的插件

都配置好,就可以打包了,需要等待一会。然后把对应平台的ab包拷贝到StreamingAssets下面,不要勾选编辑器模式,

同时确定Resource下的资源模式是Package

然后运行,功能和显示正常就可以正常打包了。
为了打包方便,加了一个打包插件,在unity的build下面,根据平台来选择,主要用来打PC和Android.

打出来的包会放在最外层的Bin文件夹下。

主要代码逻辑修改:入口继续是ProcedureLaunch->ProcedureSplash下面的Update函数:

base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
FirstLoading.setTipString("启动SDK、检测整包版本。。。");
FirstLoading.setPercent((1-waitTime));
if (waitTime>0)
{waitTime -=elapseSeconds;return;
}if (GameEntry.Base.EditorResourceMode)
{// 编辑器模式Log.Info("Editor resource mode detected.");      ChangeState(procedureOwner, typeof(ProcedureHotFix));
}
else if (GameEntry.Resource.ResourceMode == ResourceMode.Package)
{// 单机模式Log.Info("Package resource mode detected.");ChangeState(procedureOwner,typeof(ProcedureInitResources));
}
else
{// 可更新模式Log.Info("Updatable resource mode detected.");
}

这个是作者做的打包工具,可以用来验证打包资源,一般用不到

热更新

根据之前的逻辑,能看到Resource Mode

走更新的话需要将模式改成Updatable,删除StreamingAssets里面的文件,然后是一些参数配置的修改和配置文件的准备,这里使用HFS模拟本地服务器来存放打好的ab包。
ProcedureSplash里面的Update逻辑

需要有个检测版本的脚本,这里会跳转到ProcedureCheckVersion

可以看到主要有三个参数,m_CheckVersionComplete用来检测是否是否检测完成,可以看下onEnter的逻辑

base.OnEnter(procedureOwner);
m_CheckVersionComplete = false;
m_NeedUpdateVersion = false;
m_VersionInfo = null;GameEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
GameEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);// 向服务器请求版本信息
GameEntry.WebRequest.AddWebRequest(Utility.Text.Format(GameEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this);

主要是想服务器请求获取版本的信息,版本信息用了一个VersionInfo来接受,这个参数在配置文件要保持一致,之前有看到比较老的版本参数已经和现在的不一样了,主要是最后俩个参数。然后,绑定了请求成功和失败的订阅。
再看看 成功的逻辑

WebRequestSuccessEventArgs ne = (WebRequestSuccessEventArgs)e;
if (ne.UserData != this)
{return;
}// 解析版本信息
byte[] versionInfoBytes = ne.GetWebResponseBytes();
string versionInfoString = Utility.Converter.GetString(versionInfoBytes);
m_VersionInfo = Utility.Json.ToObject<VersionInfo>(versionInfoString);
if (m_VersionInfo == null)
{Log.Error("Parse VersionInfo failure.");return;
}Log.Info("Latest game version is '{0} ({1})', local game version is '{2} ({3})'.", m_VersionInfo.LatestGameVersion, m_VersionInfo.InternalGameVersion.ToString(), Version.GameVersion, Version.InternalGameVersion.ToString());if (m_VersionInfo.ForceUpdateGame)
{// 需要强制更新游戏应用GameEntry.UI.OpenDialog(new DialogParams{Mode = 2,Title = GameEntry.Localization.GetString("ForceUpdate.Title"),Message = GameEntry.Localization.GetString("ForceUpdate.Message"),ConfirmText = GameEntry.Localization.GetString("ForceUpdate.UpdateButton"),OnClickConfirm = GotoUpdateApp,CancelText = GameEntry.Localization.GetString("ForceUpdate.QuitButton"),OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit); },});return;
}// 设置资源更新下载地址
GameEntry.Resource.UpdatePrefixUri = Utility.Path.GetRegularPath(m_VersionInfo.UpdatePrefixUri);m_CheckVersionComplete = true;
m_NeedUpdateVersion = GameEntry.Resource.CheckVersionList(m_VersionInfo.InternalResourceVersion) == CheckVersionListResult.NeedUpdate;

先看看配置的文件,一般是就叫version.txt

请求成功是会获取流数据解析成VersionInfo,第一个字段就是是否强更的判断,如果强更的话会有个强更弹窗,直接跳转下载,这些链接是在Buildinfo.txt里面指定。
Buildinfo.txt是这个样子的,他也有对应buildinfo.cs结构:

我有将这个值改成了true,pc上直接跳转百度了,证明是有效的。
如果不能强更的话,就会判定资源是否需要下载,只要InternalResourceVersion和本地的不一样,就会访问UpdatePrefixUri配置的地址,同时把检查版本信息完成的状态改成true,就会在update里面走更新的逻辑并且设置列表里面的后四位参数

这四个参数是每次本地打ab包生成的BuildReport里面的BuildLog.txt里面

打开这个文件,找到对应的参数然后复制到version.txt里面

记得找对应平台的,写错了可能会出现不可预知的问题,根据提示消息修改即可。

ProcedureUpdateVersion

这里主要是下载对应的ab包,等下载完成了,

ProcedureVerifyResources

然后进入了资源验证的阶段,这里面主要是增加了三个订阅,如果认证成功了就进入了检查资源阶段->ProcedureCheckResources阶段

ProcedureCheckResources

这里开始检查资源的下载进度,如果需要下载会走ProcedureUpdateResources,这里开始资源下载,会有个进度条;如果不需要下载资源,则会直接走ProcedurePreload的逻辑

等下载完了,也会进入ProcedurePreload阶段

ps:本地使用hfs的使用会提示

查了下是因为本地没有开启IIS服务,开启就可以了

其他

如果要热更新的话,要明确俩个地址:
一个是下载versioninfo的地址 一个是versioninfo里面存储的下载文件的地址
versioninfo在BuildInfo.txt里面,自己每次更新这个配置表来决定是否需要更新

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18NfokJ7-

每次将version.txt的内容修改发布,最新的资源上传到服务器就可以了。

文件的地址
versioninfo在BuildInfo.txt里面,自己每次更新这个配置表来决定是否需要更新

每次将version.txt的内容修改发布,最新的资源上传到服务器就可以了。

这样整体的更新流程应该都没问题了,pc和安卓都已验证。

欢迎大家交流,有不妥之处,还请指正,谢谢。
ps:欢迎大家进q群交流游戏开发的问题(632313288)
GameFramework篇:资源热更新讲解
GameFramework篇:StarForce资源热更新讲解(二:具体操作步骤)

Unity GameFramework-打包和热更新模块(Resources资源)相关推荐

  1. 【Unity】 HTFramework框架(十九)ILHotfix热更新模块

    更新日期:2019年9月27日. Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 ILHotfix热更新模块简介 使用ILHotfix热更新 创建ILHotfix环境 创建 ...

  2. Unity应用的iOS热更新

    Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ? 什么是热更新 ? 为何要热更新 ? 如何在iOS 上对Unity 应用进行热更新 ? 支持 ...

  3. Unity游戏开发-游戏热更新以及登录流程

    本篇主要分享基于热更新的游戏初始化方案. 整体初始化的流程大致为:检查是否需要解压资需要则解压,之后再检查是否存在需要热更新的资源文件需要则更新,更新完成后则初始化结束可进入登录界面. 关于登录这块的 ...

  4. 【游戏开发高阶】从零到一教你Unity使用ToLua实现热更新(含Demo工程 | LuaFramework | 增量 | HotUpdate)

    文章目录 零.前言 一.我做的热更新Demo 1.效果演示 2.流程图 3.工程源码 二.为什么要有热更新 三.Unity如何支持热更新 1.热更C#代码 2.热更lua代码与资源 四.Unity中集 ...

  5. Unity为什么ios不能热更新

    unity的c#代码运行的方式以及可以通过拆分代码模块,将可能需要更新扩展的逻辑放到一个独立的.dll中,通过更新这个.dll文件来实现热更新. 但是这种朴素的想法在ios平台会受到限制. c#编译出 ...

  6. cordova打包app热更新问题

    定义: 基于 cordova 框架能将web应用 (js, html, css, 图片等) 打包成 App.当 App 在终端上安装后,不需要重新下载app,实现内壳更新. 原理:1.在项目根目录的c ...

  7. Tinker热更新与AndResGuard资源混淆的结合

    Tinker的配置   目前公司项目中使用Tinker作为热更新方案,由于Bugly的热更新是基于Tinker,并且提供了补丁的自动下载.合成.应用的功能以及补丁管理后台,所以集成了Bugly的热更新 ...

  8. tolua unity 报错_Unity3D热更新之LuaFramework篇[01]--从零开始

    解压刚刚下载好的压缩包,发现里面是一个Unity工程(如图2-1),于是用 unity打开此工程. 图2-1 我使用的Unity版本为5.5.5f1,会提示需要升级,是否备份,点"Go He ...

  9. Unity游戏开发客户端面经——热更新(初级)

    前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习.由于文本太多,按类型分开.这一篇是 热更新 常问问题总结,有帮助的可以收藏. 1. 热更新的原理 1.1 为什么使用Lu ...

最新文章

  1. Task04:青少年软件编程(Scratch)等级考试模拟卷(二级)
  2. 老大说,网上这种获取真实IP地址的方法不对,我不信...
  3. 搜索专题【2010】四2.过河问题
  4. python模块的导入的两种方式区别详解
  5. Django中类视图的几实现方式
  6. python读取图片并储存为CSV文件
  7. JSON时间转换格式化
  8. ubuntu显卡驱动下载安装
  9. 4.FX Blue 本地跟单软件EA参数说明
  10. “被授权”泛滥 个人信息保护怎么管?
  11. python中abs和fabs的区别_Python - abs vs fabs
  12. calc桌面计算机,Calc1(桌面计算器)
  13. 全景图像拼接(一)关于全景拼接论文推荐
  14. Mysql RR级别下如何解决幻读
  15. 访韩家炜教授记录(部分)
  16. pandas 筛选数据的 8 个骚操作
  17. win10开机任务栏转圈假死怎么办
  18. 【python 接口开发】如何用python开发自己的接口
  19. nginx【30】listen指令的用法
  20. http状态码301、302、303、307、308区别

热门文章

  1. 游侠联机不了服务器未响应,仁王联机补丁跳出问题解决方法 仁王游戏停止未响应怎么办-游侠网...
  2. SDN被放弃?5G承载网:我一点也不慌!
  3. ps打开图片显示为索引,无法创建图层进行操作解决方法
  4. 萌斗三国服务器维护,《萌斗三国》基本资料
  5. TIA博途中更换HMI面板后,自动调整画面大小的具体方法
  6. JavaBean封装
  7. Dreamweaver安装教程
  8. 关于android原生AlertDialog列表item样式修改问题
  9. 基于电子健康档案的区域医疗 SOA 解决方案
  10. 电子健康档案管理系统