可寻址系统远程加载 -- 资源预下载 -- 进阶(三)
概述:实现方式是使用Unity的可寻址系统结合云资源分发(AA+CCD)的形式。本篇文章就来为讲解CCD的使用介绍,以及AA+CCD使用的示例。
在Hub界面的游戏云选项,可以看到官网介绍入口:

CCD:全称Cloud Content Delivery,译为:云端资源分发。
Unity 推出首个用于实时游戏更新的端到端服务:专为游戏开发打造的内容分发网络 (CDN) 和后端即服务 (BAAS)。
Unity最新的在线资源更新服务,结合革新性的Addressable Assets资源管理系统帮助开发者借助云端强大的资源管理和内容分发能力,轻松制作和发布游戏更新。
免费流量额度: 一般用户最高10T,Pro用户最高50T。
使用前需要在Unity后台,创建项目并开启相应服务,流程如下:
前往Unity项目界面:后台入口 点击前往,PS:登录使用账号,需要和Hub使用账号一致:

右上角这个地方可以管理组织:

点击“Crendentials”到账号绑定界面,选择组织进行绑定腾讯云账号,绑定后成功后是下面那个样子(若是新建账号,还需要登录腾讯云进行实名认证即可)

选择“Cloud Content Delivery“,然后选择组织,点击开通服务即可:

开启服务后,回到“Cloud Content Delivery“页,下拉,选择自己的项目:

选择项目后跳转到项目设置页,下面有一个“Buckets”,然后创建一个桶用来存储资源:

选择项目后跳转到项目设置页,下面有一个“COS Key”,这个后面需要填写到工程里:

官方文档:CCD用户使用手册
插件导入工程:Window -> Pack Manager -> 搜索Cloud Content Delivery

设置Cloud Content Delivery的COS Key,在ProejctSetting面板,如下图。这样才能把本地项目和远程连接上。

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

Badge是可以切换标记Release的,若用户通过Badge来访问资源,则可以通过Badge的切换来实现访问不同的资源,这时访问资源的URL是不需要更换的。
PS:这里有一个点需要注意的是,上传资源时需要将AddressableAssetSettings的路径设置为Remote:
否则会弹出如下提示:

修改设置如下:

还有一个注意事项:
在配合addressable使用release的promote功能时,务必使两个bucket对应的addressable的Settings(Window -> Asset Managment -> Addressables -> Settings)中Catlog选项下的Player Version Override的值保持一致且不为空!因为Catalog的配置文件名称是和这个版本对应的,所以不能对不上。

打包后的配置:

官方使用示例:CDD命令行界面使用
要设置 CCD 以使用 CLI,请执行以下操作:
如果是首次使用 Unity 服务:
CLI 中的 CCD 命令的基本格式如下:
ucd [命令]
可用命令为:
ucd --version
可以在任何命令后添加以下全局标志:
命令使用示例:
ucd buckets create [项目ID] [桶名字]
ucd buckets listCos
ucd config set bucket [桶ID]
ucd entries syncCos [local_dir_path]
ucd entries list
PS:存储桶和条目名称区分大小写。
打包地址分为:本地路径和远程路径。这两个路径都在Addressables Profies面板显示:

PS:没设置明白的童鞋,建议去查看前面的入门文章:2.3 Profiles - 配置文件 详细介绍
这个地方设置完成之后,就可以分别对每个分组进行设置为远程组还是本地组了:

将Build Load Path设置为Remote,就已将本组设置为远程组了,此时再次打资源包,此组的Bundle包就会在远程组设置的Build路径下显示了,而不会打包安装包里面。当游戏中使用文件时,也在远程进行加载的。
修改完成后就可以打资源包了:在Group面板找到Build选项,然后选择“New Build” -> “Default Build Script”:

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

然后就可以执行一种步骤使用CCD进行上传资源了。
基础如下:
使用的是Addressables系统的Download相关API。
下载场景搭建:

预下载逻辑实现:
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可寻址系统 – 资源热更新 – 进阶(四)
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit