当前位置:   article > 正文

YooAsset实现简单的资源热更新方案_yooassets支持ios热更么

yooassets支持ios热更么


Unity项目中,热更新是一个不可或缺的重要模块,热更新简单解释就是在软件不重新安装的情况下进行版本迭代,它可以给用户的带来更号的体验感,目前市面上大部分联网应用都会在项目架构阶段考虑热更新方案。本文带来的是使用YooAsset插件实现简单的资源热更新,仅供参考!


YooAsset资源热更新步骤

YooAsset插件的安装方法在之前的文章中《unity资源管理方案-YooAsset的使用》
为了方便规范热更新的步骤,我们这里采用的是流程模式。

文末有完整的Demo工程

1.初始化资源包配置

本阶段是初始化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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

远程服务参数定义,其中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;
     }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.对比服务器资源版本号与本地资源版本号来判断是否存在热更资源

请求远程版本号信息,判断是否需要进行更新

/// <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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.更新资源清单

请求资源清单

/// <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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4.下载服务器资源包

资源下载模块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;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

开始下载资源,并保存在StreamingAssets常态化目录下,使用上述的下载器中的两个回调,可以追踪下载过程和错误报告。

private async UniTaskVoid BeginDownload()
{
    // 注册下载回调
    downloader.OnDownloadErrorCallback = OnDownloadErrorCallback;
    downloader.OnDownloadProgressCallback = OnDownloadProgressCallback;
    downloader.BeginDownload();
    await downloader;

    // 检测下载结果
    if (downloader.Status != EOperationStatus.Succeed)
        return;
    UnityEngine.Debug.Log("资源下载完成!!" );
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5.进入主程序

下载完成后,我们就可以进入主程序了,可以开始使用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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

完整Demo工程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/86199
推荐阅读
相关标签
  

闽ICP备14008679号