#Unity GameFrameWork框架- Resources模块

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

StarForceUGF ExtensionHFS本地服务器

目前主要是说下出包相关

获取资源模式
Game Framework 中,资源模式分为三种:Package(单机模式)、Updatable(预下载的可更新模式)、UpdatableWhilePlaying(使用时下载的可更新模式)。

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

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

unity 热更 hotfix unity 热更新模型_unity

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

关于这点,E大也说过:

unity 热更 hotfix unity 热更新模型_热更新_02

首先引入插件来打ab包,作者提供的不太好用。作者提供的可以后面来查看ab包是否打成功了。

首先要引入这些标签,这样他能通过这些标签获取数据。

unity 热更 hotfix unity 热更新模型_游戏引擎_03

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

unity 热更 hotfix unity 热更新模型_游戏引擎_04


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

unity 热更 hotfix unity 热更新模型_unity_05

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

unity 热更 hotfix unity 热更新模型_unity 热更 hotfix_06

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

unity 热更 hotfix unity 热更新模型_版本信息_07

unity 热更 hotfix unity 热更新模型_unity 热更 hotfix_08

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

unity 热更 hotfix unity 热更新模型_游戏引擎_09

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

unity 热更 hotfix unity 热更新模型_unity_10

然后运行,功能和显示正常就可以正常打包了。

为了打包方便,加了一个打包插件,在unity的build下面,根据平台来选择,主要用来打PC和Android.

unity 热更 hotfix unity 热更新模型_热更新_11

打出来的包会放在最外层的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.");
}

unity 热更 hotfix unity 热更新模型_unity 热更 hotfix_12

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

unity 热更 hotfix unity 热更新模型_热更新_13

热更新

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

unity 热更 hotfix unity 热更新模型_unity_14

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

ProcedureSplash里面的Update逻辑

unity 热更 hotfix unity 热更新模型_unity 热更 hotfix_15

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

unity 热更 hotfix unity 热更新模型_版本信息_16

可以看到主要有三个参数,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

unity 热更 hotfix unity 热更新模型_热更新_17

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

Buildinfo.txt是这个样子的,他也有对应buildinfo.cs结构:

unity 热更 hotfix unity 热更新模型_游戏引擎_18

我有将这个值改成了true,pc上直接跳转百度了,证明是有效的。

如果不能强更的话,就会判定资源是否需要下载,只要InternalResourceVersion和本地的不一样,就会访问UpdatePrefixUri配置的地址,同时把检查版本信息完成的状态改成true,就会在update里面走更新的逻辑并且设置列表里面的后四位参数

unity 热更 hotfix unity 热更新模型_unity_19

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

unity 热更 hotfix unity 热更新模型_unity 热更 hotfix_20

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

unity 热更 hotfix unity 热更新模型_游戏引擎_21

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

ProcedureUpdateVersion

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

unity 热更 hotfix unity 热更新模型_版本信息_22

ProcedureVerifyResources

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

unity 热更 hotfix unity 热更新模型_版本信息_23

ProcedureCheckResources

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

unity 热更 hotfix unity 热更新模型_版本信息_24

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

unity 热更 hotfix unity 热更新模型_版本信息_25

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

unity 热更 hotfix unity 热更新模型_unity 热更 hotfix_26

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

unity 热更 hotfix unity 热更新模型_unity_27

其他

如果要热更新的话,要明确俩个地址:

一个是下载versioninfo的地址 一个是versioninfo里面存储的下载文件的地址

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

unity 热更 hotfix unity 热更新模型_unity_28

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

unity 热更 hotfix unity 热更新模型_游戏引擎_29

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

文件的地址

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

unity 热更 hotfix unity 热更新模型_游戏引擎_30

unity 热更 hotfix unity 热更新模型_版本信息_31

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

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

欢迎大家交流,有不妥之处,还请指正,谢谢。