Unity 之 Addressable可寻址系统 -- 资源远程加载 | 资源预下载 -- 进阶(三)

这篇具有很好参考价值的文章主要介绍了Unity 之 Addressable可寻址系统 -- 资源远程加载 | 资源预下载 -- 进阶(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述:实现方式是使用Unity的可寻址系统结合云资源分发(AA+CCD)的形式。本篇文章就来为讲解CCD的使用介绍,以及AA+CCD使用的示例。

一,Unity 云资源分发 – 使用介绍

1.1 CCD 的介绍

在Hub界面的游戏云选项,可以看到官网介绍入口:

unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

CCD:全称Cloud Content Delivery,译为:云端资源分发。

Unity 推出首个用于实时游戏更新的端到端服务:专为游戏开发打造的内容分发网络 (CDN) 和后端即服务 (BAAS)。

Unity最新的在线资源更新服务,结合革新性的Addressable Assets资源管理系统帮助开发者借助云端强大的资源管理和内容分发能力,轻松制作和发布游戏更新。

免费流量额度: 一般用户最高10T,Pro用户最高50T。


1.2 后台准备工作

使用前需要在Unity后台,创建项目并开启相应服务,流程如下:

  1. 前往Unity项目界面:后台入口 点击前往,PS:登录使用账号,需要和Hub使用账号一致:
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  2. 右上角这个地方可以管理组织:
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  3. 点击“Crendentials”到账号绑定界面,选择组织进行绑定腾讯云账号,绑定后成功后是下面那个样子(若是新建账号,还需要登录腾讯云进行实名认证即可)
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  4. 选择“Cloud Content Delivery“,然后选择组织,点击开通服务即可:
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  5. 开启服务后,回到“Cloud Content Delivery“页,下拉,选择自己的项目:
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  6. 选择项目后跳转到项目设置页,下面有一个“Buckets”,然后创建一个桶用来存储资源:
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  7. 选择项目后跳转到项目设置页,下面有一个“COS Key”,这个后面需要填写到工程里:
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

官方文档:CCD用户使用手册


二,CDD的使用

2.1 CCD可视化界面的使用

  1. 插件导入工程:Window -> Pack Manager -> 搜索Cloud Content Delivery
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  2. 设置Cloud Content DeliveryCOS Key,在ProejctSetting面板,如下图。这样才能把本地项目和远程连接上。
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

  3. 打开插件管理面包:Window -> Cloud Content Delivery -> Manager。
    操作步骤:1.选择桶;2.选择打包好的资源上传;3.新建发布版本;4.设置可寻址系统远程资源加载地址(打包前设置)。其中Badge是标记,用来标记Release的。
    unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

Badge是可以切换标记Release的,若用户通过Badge来访问资源,则可以通过Badge的切换来实现访问不同的资源,这时访问资源的URL是不需要更换的。

PS:这里有一个点需要注意的是,上传资源时需要将AddressableAssetSettings的路径设置为Remote
否则会弹出如下提示:
unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

修改设置如下:
unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

还有一个注意事项:
在配合addressable使用releasepromote功能时,务必使两个bucket对应的addressableSettings(Window -> Asset Managment -> Addressables -> Settings)中Catlog选项下的Player Version Override的值保持一致且不为空!因为Catalog的配置文件名称是和这个版本对应的,所以不能对不上。
unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

打包后的配置:
unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎


2.2 CDD命令行界面使用

官方使用示例:CDD命令行界面使用

2.2.1 准备工作

要设置 CCD 以使用 CLI,请执行以下操作:

如果是首次使用 Unity 服务:

  1. 创建一个 Unity ID 帐户(如果还没有此帐户)。
    从 Develop 选项卡登录到 Develop Dashboard。
    单击 Create New Project,然后在 Create New Project 窗口中输入详细信息。
  2. 在 Develop Dashboard 中,选择您的项目。
  3. 选择项目名称,或单击 View。
  4. 在 Develop Dashboard 的 Overview 页面左侧导航栏中,选择 Content Delivery。
  5. 在左侧导航栏中,选择 Download CLI。
  6. 要下载 CLI,请找到您的操作系统的版本,然后选择下载图标。
  7. 在左侧导航栏中,前往 COS Key 部分。
  8. 复制您的 COS 密钥。
  9. 在要从中上传内容的计算机上运行 CLI。
  10. 通过 auth 命令使用您的 COS 密钥登录 CLI。

2.2.2 CLI 用法

CLI 中的 CCD 命令的基本格式如下:

ucd [命令]

可用命令为:

  • auth:向 Content Delivery 进行身份验证。
  • badges:管理发布版本的标示。
  • buckets:管理项目的存储桶。
  • config:管理用于设置和标识当前存储桶的选项。
  • entries:管理当前存储桶的条目。
  • releases:管理当前存储桶的发布版本。
    要查看当前使用的 CLI 版本,请添加 --version 标志:
ucd --version

可以在任何命令后添加以下全局标志:

  • –apikey string:用户指定的 COS 密钥,用于访问 Content Delivery。
  • -h、–help:显示给定命令的所有其他参数和标志。
  • -q、–quiet:禁止显示由指定命令执行的操作。
  • -v、–verbose:显示错误信息。

命令使用示例:

  • 创建存储桶:
ucd buckets create [项目ID] [桶名字]
  • 列出项目的所有存储桶:
ucd buckets listCos
  • 将当前存储桶设置为激活的存储桶:
ucd config set bucket [桶ID]
  • 将本地文件夹与当前存储桶同步:
ucd entries syncCos [local_dir_path]
  • 查看当前存储桶中所有条目的列表:
ucd entries list

PS:存储桶和条目名称区分大小写。


三,AA + CCD资源更新 – 实例练习

3.1 打包设置资源地址

打包地址分为:本地路径和远程路径。这两个路径都在Addressables Profies面板显示:

unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

PS:没设置明白的童鞋,建议去查看前面的入门文章:2.3 Profiles - 配置文件 详细介绍

这个地方设置完成之后,就可以分别对每个分组进行设置为远程组还是本地组了:
unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

将Build Load Path设置为Remote,就已将本组设置为远程组了,此时再次打资源包,此组的Bundle包就会在远程组设置的Build路径下显示了,而不会打包安装包里面。当游戏中使用文件时,也在远程进行加载的。

修改完成后就可以打资源包了:在Group面板找到Build选项,然后选择“New Build” -> “Default Build Script”:

unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

等待进度条执行完成,即可看到打包成功日志:

unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

然后就可以执行一种步骤使用CCD进行上传资源了。


3.2 预下载获取下载进度

基础如下:

  1. 总大小 = 获取所有下载组的大小
  2. 当前大小 = 获取当前组下载进度 + 已下载组大小
  3. 进度 = 当前大小 - 总大小

使用的是Addressables系统的Download相关API。

下载场景搭建:
unity addressable预加载,《Unity 之 Addressable》,unity,游戏引擎

预下载逻辑实现:

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;

// 检测更新并下载资源
public class DownloadManager : MonoBehaviour
{
    /// <summary>
    /// 显示下载状态和进度
    /// </summary>
    public Text updateText;

    /// <summary>
    /// 重试按钮
    /// </summary>
    public Button retryBtn;

    private AsyncOperationHandle downloadDependencies;
    
    // 下载文件Key
    private string downLoadKey = "Cube";
    
    /// <summary>
    /// 下载多个文件列表
    /// PS: 一个组内填写一个资源Key即可,下载时会按照资源组进行下载
    /// </summary>
    private List<string> downLoadKeyList = new List<string>()
    {
        "Cube", "Logo"
    };
    
    // 当前下载文件索引
    private int downLoadIndex = 0;
    // 下载完成文件个数
    private int downLoadCompleteCount = 0;
    // 下载每组资源大小
    List<long> downLoadSizeList = new  List<long>();
    // 下载资源总大小
    private long downLoadTotalSize = 0;
    // 当前下载大小
    private float curDownLoadSize = 0;
    // 下载完成
    private bool isDownLoadFinished = false;
    
    void Start()
    {
        downLoadIndex = 0;
        // 重试
        retryBtn.onClick.AddListener(() =>
        {
            retryBtn.gameObject.SetActive(false);
            StartCoroutine(StartPreload());
        });
        
        // 开始预下载
        StartCoroutine(StartPreload());
    }
    
    /// <summary>
    /// 预下载
    /// </summary>
    /// <param name="key">资源包key</param>
    /// <returns></returns>
    public IEnumerator StartPreload()
    {
        Debug.Log("开始下载");
        
        // 初始化 --> 加载远端的配置文件
        yield return Addressables.InitializeAsync();
        
        // 清理缓存
        Caching.ClearCache();

        for (int i = 0; i < downLoadKeyList.Count; i++)
        {
            AsyncOperationHandle<long> size = Addressables.GetDownloadSizeAsync(downLoadKeyList[i]);
            Debug.Log("获取下载内容大小:" + size.Result);
            downLoadSizeList.Add(size.Result);
            downLoadTotalSize += size.Result;
        }

        if (downLoadTotalSize <= 0)
        {
            Debug.LogError("无可预下载内容~");
            yield break;
        }
        isDownLoadFinished = true;

        for (int i = downLoadIndex; i < downLoadKeyList.Count; i++)
        {
            downloadDependencies = Addressables.DownloadDependenciesAsync(downLoadKeyList[i]);
            yield return downloadDependencies;
            if (downloadDependencies.Status == AsyncOperationStatus.Failed)
            {
                downLoadIndex = i;
                isDownLoadFinished = false;
                updateText.text = "下载失败,请重试...";
                retryBtn.gameObject.SetActive(true);
                yield break;
            }
            else
            {
                downLoadCompleteCount = i + 1;
            }
        }

        Debug.Log("下载完成"); ;
    }

     
    private void Update()
    {
        // 下载是否有效
        if (isDownLoadFinished && downloadDependencies.IsValid())
        {
            curDownLoadSize = 0;
            for (int i = 0; i < downLoadSizeList.Count; i++)
            {
                if (i < downLoadCompleteCount)
                {
                    curDownLoadSize += downLoadSizeList[i];
                }
            }

            if (downLoadCompleteCount < downLoadSizeList.Count - 1)
                curDownLoadSize += downloadDependencies.GetDownloadStatus().Percent;

            float percent = curDownLoadSize * 1.0f / downLoadTotalSize;
            //Debug.Log($"共{downLoadKeyList.Count}个文件,下载到第{downLoadCompleteCount}个文件,当前文件下载进度{downloadDependencies.GetDownloadStatus().Percent},总下载进度{percent}。");
               
            if (percent < 1)
            {
                updateText.text = "正在下载:" + (percent * 100).ToString("F1") + "%";
            }
            else if (downloadDependencies.IsDone)
            {
                isDownLoadFinished = false;
                updateText.text = "下载完成";
                Debug.Log("下载完成 释放句柄");
                // 下载完成释放句柄
                Addressables.Release(downloadDependencies);
            }
        }
    }
}

TODO:上一篇 --> Unity 之 Addressable可寻址系统 – 资源加载和释放 – 进阶(二)

TODO:下一篇 --> Unity 之 Addressable可寻址系统 – 资源热更新 – 进阶(四)文章来源地址https://www.toymoban.com/news/detail-795273.html

到了这里,关于Unity 之 Addressable可寻址系统 -- 资源远程加载 | 资源预下载 -- 进阶(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 如何基于addressable来做资源管理

    一、什么是Addressable系统 Addressable系统是Unity 2018.3版本中推出的一种资源管理方案,它可以帮助我们更好地管理游戏中的资源。在以往的游戏开发中,我们通常使用Resources来进行资源加载,但是这种方式存在很多问题,比如加载速度慢、内存占用高等。Addressable系统可以解决这

    2024年02月16日
    浏览(33)
  • Unity Addressables学习笔记(1)---创建远程服务器加载资源

    Unity Addressables学习笔记—汇总 Bulid Path选择RemoteBuildPath Load Path我选择了custom,地址是http://localhost:8080/WebGL/ 遇坑1 :最开始我选择的Build Path 是 LocalBuildPath,Load Path是custom的时候报错如下: 解决办法:把Build Path 改为RemoteBuildPath后才好,我也不知道为什么不能把本地的资源放到远程

    2024年02月14日
    浏览(36)
  • Unity 从服务器加载AssetBundle资源写入本地内存,并将下载保存的AB资源从本地内存加载至场景

    AB资源打包后有一个【目录文件】AssetBundle,他保存了所有AB资源的路径与名称, 通过aLLAssetBundleURL链接路径 组拼 从【目录文件】获得的AB资源的名字,然后再协程方法内编写相关代码,从而实现从服务器加载资源的功能。详细见代码。

    2024年02月13日
    浏览(39)
  • Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题

    Unity编辑器在PC平台下使用Addressable加载打包好的Cube,运行发现能正常显示。 而在切换到Android平台下,使用Addressable时加载AB包,生成Cube对象时,Cube模型呈现粉红色,出现类似材质丢失的问题。如下图所示。 这是因为GraphicAPI不同导致的。编辑器默认用的是PC平台的GraphicAPI。

    2024年02月08日
    浏览(44)
  • Addressable 异步加载场景并获取加载进度

    一开始用PercentComplete函数获取加载进度,发现每次都是从0.85开始计算,不准,官方文档解释:“ PercentComplete 将反映总体操作的进展情况,而不会准确地表示仅下载百分比或加载到内存中的百分比。 ” ,“ 要获得准确的下载百分比,请使用GetDownloadStatus()。” GetDownloadStatu

    2024年02月12日
    浏览(37)
  • Unity 场景加载和资源加载

    一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源

    2024年02月04日
    浏览(39)
  • Unity使用 Addressables 预加载所有资源,提现加载资源,发布webgl加载缓慢问题

    Addressables 我也是刚接触,知道的不是很多,基本的用法还是知道一些的 1 .在Window–Package Manager里找到Addressables进行安装   2.选择资源,点击Assets中的一个资源,在Inspector面板上就会出现一个勾选Assressable,也就是是否加入资源打包的分组,和AssetBundle分组是一个性质。选上以

    2023年04月08日
    浏览(44)
  • Unity中资源异步加载

            Unity作为一款优秀的游戏引擎,广泛应用于游戏制作领域。在游戏的开发过程中,资源加载的效率和流畅度尤为重要。对于较大的资源文件,同步加载方式可能会导致游戏卡顿、延迟等问题。因此,采用异步加载的方法可以提高游戏的效率和用户体验。 本篇博客将

    2024年02月06日
    浏览(53)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(35)
  • 【Unity程序技巧】 资源加载管理器

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 1.涉及知识点 2. 特点 方便加载资源,为资源加载提供了接口 3.脚本 加载测试 ⭐【Unityc#专题篇】之c#进阶篇】 ⭐【Unityc#专

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包