赞
踩
Unity项目中,热更新是一个不可或缺的重要模块,热更新简单解释就是在软件不重新安装的情况下进行版本迭代,它可以给用户的带来更号的体验感,目前市面上大部分联网应用都会在项目架构阶段考虑热更新方案。本文带来的是使用YooAsset插件实现简单的资源热更新,仅供参考!
YooAsset插件的安装方法在之前的文章中《unity资源管理方案-YooAsset的使用》
为了方便规范热更新的步骤,我们这里采用的是流程模式。
文末有完整的Demo工程
本阶段是初始化YooAsset的设置参数,定义资源的路径信息和加载方式(离线,远程等),因为我们此处需要做资源热更,所以我们选择的远程资源模式,下面的代码就是指定了远程资源的网络路径等基本配置。
远程资源路径的测试可以使用第三方的本地服务器工具来实现,推荐nginx
/// <summary> /// 初始化资源包裹。 /// </summary> /// <returns>初始化资源包裹操作句柄。</returns> public InitializationOperation InitDefaultPackage() { YooAssets.Initialize(); // 创建默认的资源包 var package = YooAssets.TryGetPackage(PackageName); if (package == null) { package = YooAssets.CreatePackage(PackageName); YooAssets.SetDefaultPackage(package); } var createParameters = new HostPlayModeParameters(); createParameters.DecryptionServices = new GameDecryptionServices(); createParameters.BuildinQueryServices = new BuiltinQueryServices(); createParameters.DeliveryQueryServices = new DefaultDeliveryQueryServices(); createParameters.RemoteServices = new RemoteServices(PackageName); createParameters.DeliveryLoadServices = new DeliveryLoadServices(); return package.InitializeAsync(createParameters); }
远程服务参数定义,其中HostUrl的说明在 《本地服务器工具的使用-nginx》中已经有所说明
public class RemoteServices : IRemoteServices { public string Package; public RemoteServices(string package) { Package = package; } //访问地址中的IP为服务器的网络IP,因为项目打包后不在本地电脑上运行的情况下,需要指定具体的IP才能访问,可以自己替换 public const string HostUrl = "http://192.168.81.xx/tools/"; public const string PackageName = "DefaultPackage"; public string GetRemoteMainURL(string fileName) { return HostUrl + PackageName+"/"+ fileName; } public string GetRemoteFallbackURL(string fileName) { return HostUrl + PackageName + "/" + fileName; } }
请求远程版本号信息,判断是否需要进行更新
/// <summary>
/// 异步更新最新包的版本。
/// </summary>
/// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param>
/// <param name="timeout">超时时间。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>请求远端包裹的最新版本操作句柄。</returns>
public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = false, int timeout = 60,
string customPackageName = "")
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.PackageName)
: YooAssets.GetPackage(customPackageName);
return package.UpdatePackageVersionAsync(appendTimeTicks, timeout);
}
请求资源清单
/// <summary>
/// 向网络端请求并更新清单
/// </summary>
/// <param name="packageVersion">更新的包裹版本</param>
/// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param>
/// <param name="timeout">超时时间(默认值:60秒)</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion,
bool autoSaveVersion = true, int timeout = 60, string customPackageName = "")
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.PackageName)
: YooAssets.GetPackage(customPackageName);
return package.UpdatePackageManifestAsync(packageVersion, autoSaveVersion, timeout);
}
资源下载模块YooAsset已经为我们封装好了现成的下载器
创建资源下载器,ResourceDownloaderOperation中有需要下载的资源的基本信息,如资源内存大小,资源数量等。
/// <summary>
/// 创建资源下载器,用于下载当前资源版本所有的资源包文件。
/// </summary>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public async Task<ResourceDownloaderOperation> CreateResourceDownloader()
{
var package = YooAssets.TryGetPackage(this.PackageName);
var operation= package.CreateResourceDownloader(3, 3);
await operation.Task;
return operation;
}
开始下载资源,并保存在StreamingAssets常态化目录下,使用上述的下载器中的两个回调,可以追踪下载过程和错误报告。
private async UniTaskVoid BeginDownload()
{
// 注册下载回调
downloader.OnDownloadErrorCallback = OnDownloadErrorCallback;
downloader.OnDownloadProgressCallback = OnDownloadProgressCallback;
downloader.BeginDownload();
await downloader;
// 检测下载结果
if (downloader.Status != EOperationStatus.Succeed)
return;
UnityEngine.Debug.Log("资源下载完成!!" );
}
下载完成后,我们就可以进入主程序了,可以开始使用YooAsset资源加载接口进行资源加载,此时加载的资源即为远程服务器中的最新版本的资源。
下面演示的是异步加载预制体
private async void OnCompleted()
{
Debug.Log("资源包加载完成!!");
var _package = YooAssets.GetPackage(this.PackageName);
//资源包加载完毕,开始加载资源,location为寻址路径Group名称+“_”+资源名称,如果没有开启寻址,location即为完整素材路径
var handler = _package.LoadAssetAsync<GameObject>("Prefabs_3Seat");
await handler.Task;
var go = handler.AssetObject as GameObject;
go = GameObject.Instantiate(go);
go.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。