#Unity GameFrameWork框架- Resources模块
StarForce
UGF Extension
HFS本地服务器
获取资源模式
Game Framework 中,资源模式分为三种:Package(单机模式)、Updatable(预下载的可更新模式)、UpdatableWhilePlaying(使用时下载的可更新模式)。
Package(单机模式):适用于单机游戏,游戏资源无需在 app 内进行更新时使用此模式。
Updatable(预下载的可更新模式):适用于中大型网络游戏,游戏资源需要在游戏主流程开始前更新完毕,以保证良好的游戏内体验。
UpdatableWhilePlaying(使用时下载的可更新模式):适用于小型网络游戏,游戏资源可以在游戏主流程进行的过程中进行更新。游戏运行过程中,遇到需要加载某个资源但该资源尚未下载时,会先去下载资源再进行加载,故此行为可能导致较差的游戏体验,不建议使用。
但是正常打出pc 安卓包这种他是去SteamingAssets下面找对应的ab资源,所以我们需要把相关的资源打成ab包然后移到这个文件夹。
关于这点,E大也说过:
首先引入插件来打ab包,作者提供的不太好用。作者提供的可以后面来查看ab包是否打成功了。
首先要引入这些标签,这样他能通过这些标签获取数据。
然后是加入了ResourceRule扩展
加完了,可以在界面上看到
打开就可以配置了,可以通过Add或者+号来新增
然后就可以开始打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.");
}
走更新的话需要将模式改成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(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;
请求成功是会获取流数据解析成VersionInfo,第一个字段就是是否强更的判断,如果强更的话会有个强更弹窗,直接跳转下载,这些链接是在Buildinfo.txt里面指定。
Buildinfo.txt是这个样子的,他也有对应buildinfo.cs结构:
我有将这个值改成了true,pc上直接跳转百度了,证明是有效的。
如果不能强更的话,就会判定资源是否需要下载,只要InternalResourceVersion和本地的不一样,就会访问UpdatePrefixUri配置的地址,同时把检查版本信息完成的状态改成true,就会在update里面走更新的逻辑并且设置列表里面的后四位参数
这四个参数是每次本地打ab包生成的BuildReport里面的BuildLog.txt里面
打开这个文件,找到对应的参数然后复制到version.txt里面
记得找对应平台的,写错了可能会出现不可预知的问题,根据提示消息修改即可。
然后进入了资源验证的阶段,这里面主要是增加了三个订阅,如果认证成功了就进入了检查资源阶段->ProcedureCheckResources阶段
这里开始检查资源的下载进度,如果需要下载会走ProcedureUpdateResources,这里开始资源下载,会有个进度条;如果不需要下载资源,则会直接走ProcedurePreload的逻辑
如果要热更新的话,要明确俩个地址:
一个是下载versioninfo的地址 一个是versioninfo里面存储的下载文件的地址
versioninfo在BuildInfo.txt里面,自己每次更新这个配置表来决定是否需要更新
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18NfokJ7-
每次将version.txt的内容修改发布,最新的资源上传到服务器就可以了。
文件的地址
versioninfo在BuildInfo.txt里面,自己每次更新这个配置表来决定是否需要更新
每次将version.txt的内容修改发布,最新的资源上传到服务器就可以了。
这样整体的更新流程应该都没问题了,pc和安卓都已验证。
欢迎大家交流,有不妥之处,还请指正,谢谢。
ps:欢迎大家进q群交流游戏开发的问题(632313288)
GameFramework篇:资源热更新讲解
GameFramework篇:StarForce资源热更新讲解(二:具体操作步骤)