概述:實現(xiàn)方式是使用Unity的可尋址系統(tǒng)結(jié)合云資源分發(fā)(AA+CCD)的形式。本篇文章就來為講解CCD的使用介紹,以及AA+CCD使用的示例。
一,Unity 云資源分發(fā) – 使用介紹
1.1 CCD 的介紹
在Hub界面的游戲云選項,可以看到官網(wǎng)介紹入口:
CCD:全稱Cloud Content Delivery,譯為:云端資源分發(fā)。
Unity 推出首個用于實時游戲更新的端到端服務:專為游戲開發(fā)打造的內(nèi)容分發(fā)網(wǎng)絡 (CDN) 和后端即服務 (BAAS)。
Unity最新的在線資源更新服務,結(jié)合革新性的Addressable Assets資源管理系統(tǒng)幫助開發(fā)者借助云端強大的資源管理和內(nèi)容分發(fā)能力,輕松制作和發(fā)布游戲更新。
免費流量額度: 一般用戶最高10T,Pro用戶最高50T。
1.2 后臺準備工作
使用前需要在Unity后臺,創(chuàng)建項目并開啟相應服務,流程如下:
-
前往Unity項目界面:后臺入口 點擊前往,PS:登錄使用賬號,需要和Hub使用賬號一致:
-
右上角這個地方可以管理組織:
-
點擊“Crendentials”到賬號綁定界面,選擇組織進行綁定騰訊云賬號,綁定后成功后是下面那個樣子(若是新建賬號,還需要登錄騰訊云進行實名認證即可)
-
選擇“Cloud Content Delivery“,然后選擇組織,點擊開通服務即可:
-
開啟服務后,回到“Cloud Content Delivery“頁,下拉,選擇自己的項目:
-
選擇項目后跳轉(zhuǎn)到項目設(shè)置頁,下面有一個“Buckets”,然后創(chuàng)建一個桶用來存儲資源:
-
選擇項目后跳轉(zhuǎn)到項目設(shè)置頁,下面有一個“COS Key”,這個后面需要填寫到工程里:
官方文檔:CCD用戶使用手冊
二,CDD的使用
2.1 CCD可視化界面的使用
-
插件導入工程:Window -> Pack Manager -> 搜索
Cloud Content Delivery
-
設(shè)置
Cloud Content Delivery
的COS Key
,在ProejctSetting
面板,如下圖。這樣才能把本地項目和遠程連接上。 -
打開插件管理面包:Window -> Cloud Content Delivery -> Manager。
操作步驟:1.選擇桶;2.選擇打包好的資源上傳;3.新建發(fā)布版本;4.設(shè)置可尋址系統(tǒng)遠程資源加載地址(打包前設(shè)置)。其中Badge是標記,用來標記Release的。
Badge是可以切換標記Release的,若用戶通過Badge來訪問資源,則可以通過Badge的切換來實現(xiàn)訪問不同的資源,這時訪問資源的URL是不需要更換的。
PS:這里有一個點需要注意的是,上傳資源時需要將AddressableAssetSettings
的路徑設(shè)置為Remote
:
否則會彈出如下提示:
修改設(shè)置如下:
還有一個注意事項:
在配合addressable
使用release
的promote
功能時,務必使兩個bucket
對應的addressable
的Settings
(Window -> Asset Managment -> Addressables -> Settings)中Catlog
選項下的Player Version Override
的值保持一致且不為空!因為Catalog的配置文件名稱是和這個版本對應的,所以不能對不上。
打包后的配置:
2.2 CDD命令行界面使用
官方使用示例:CDD命令行界面使用
2.2.1 準備工作
要設(shè)置 CCD 以使用 CLI,請執(zhí)行以下操作:
如果是首次使用 Unity 服務:
- 創(chuàng)建一個 Unity ID 帳戶(如果還沒有此帳戶)。
從 Develop 選項卡登錄到 Develop Dashboard。
單擊 Create New Project,然后在 Create New Project 窗口中輸入詳細信息。 - 在 Develop Dashboard 中,選擇您的項目。
- 選擇項目名稱,或單擊 View。
- 在 Develop Dashboard 的 Overview 頁面左側(cè)導航欄中,選擇 Content Delivery。
- 在左側(cè)導航欄中,選擇 Download CLI。
- 要下載 CLI,請找到您的操作系統(tǒng)的版本,然后選擇下載圖標。
- 在左側(cè)導航欄中,前往 COS Key 部分。
- 復制您的 COS 密鑰。
- 在要從中上傳內(nèi)容的計算機上運行 CLI。
- 通過 auth 命令使用您的 COS 密鑰登錄 CLI。
2.2.2 CLI 用法
CLI 中的 CCD 命令的基本格式如下:
ucd [命令]
可用命令為:
- auth:向 Content Delivery 進行身份驗證。
- badges:管理發(fā)布版本的標示。
- buckets:管理項目的存儲桶。
- config:管理用于設(shè)置和標識當前存儲桶的選項。
- entries:管理當前存儲桶的條目。
- releases:管理當前存儲桶的發(fā)布版本。
要查看當前使用的 CLI 版本,請?zhí)砑?--version 標志:
ucd --version
可以在任何命令后添加以下全局標志:
- –apikey string:用戶指定的 COS 密鑰,用于訪問 Content Delivery。
- -h、–help:顯示給定命令的所有其他參數(shù)和標志。
- -q、–quiet:禁止顯示由指定命令執(zhí)行的操作。
- -v、–verbose:顯示錯誤信息。
命令使用示例:
- 創(chuàng)建存儲桶:
ucd buckets create [項目ID] [桶名字]
- 列出項目的所有存儲桶:
ucd buckets listCos
- 將當前存儲桶設(shè)置為激活的存儲桶:
ucd config set bucket [桶ID]
- 將本地文件夾與當前存儲桶同步:
ucd entries syncCos [local_dir_path]
- 查看當前存儲桶中所有條目的列表:
ucd entries list
PS:存儲桶和條目名稱區(qū)分大小寫。
三,AA + CCD資源更新 – 實例練習
3.1 打包設(shè)置資源地址
打包地址分為:本地路徑和遠程路徑。這兩個路徑都在Addressables Profies
面板顯示:
PS:沒設(shè)置明白的童鞋,建議去查看前面的入門文章:2.3 Profiles - 配置文件 詳細介紹
這個地方設(shè)置完成之后,就可以分別對每個分組進行設(shè)置為遠程組還是本地組了:
將Build Load Path設(shè)置為Remote,就已將本組設(shè)置為遠程組了,此時再次打資源包,此組的Bundle包就會在遠程組設(shè)置的Build路徑下顯示了,而不會打包安裝包里面。當游戲中使用文件時,也在遠程進行加載的。
修改完成后就可以打資源包了:在Group面板找到Build選項,然后選擇“New Build” -> “Default Build Script”:
等待進度條執(zhí)行完成,即可看到打包成功日志:
然后就可以執(zhí)行一種步驟使用CCD進行上傳資源了。
3.2 預下載獲取下載進度
基礎(chǔ)如下:
- 總大小 = 獲取所有下載組的大小
- 當前大小 = 獲取當前組下載進度 + 已下載組大小
- 進度 = 當前大小 - 總大小
使用的是Addressables系統(tǒng)的Download
相關(guān)API。
下載場景搭建:
預下載邏輯實現(xiàn):
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>
/// 顯示下載狀態(tài)和進度
/// </summary>
public Text updateText;
/// <summary>
/// 重試按鈕
/// </summary>
public Button retryBtn;
private AsyncOperationHandle downloadDependencies;
// 下載文件Key
private string downLoadKey = "Cube";
/// <summary>
/// 下載多個文件列表
/// PS: 一個組內(nèi)填寫一個資源Key即可,下載時會按照資源組進行下載
/// </summary>
private List<string> downLoadKeyList = new List<string>()
{
"Cube", "Logo"
};
// 當前下載文件索引
private int downLoadIndex = 0;
// 下載完成文件個數(shù)
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("獲取下載內(nèi)容大?。? + size.Result);
downLoadSizeList.Add(size.Result);
downLoadTotalSize += size.Result;
}
if (downLoadTotalSize <= 0)
{
Debug.LogError("無可預下載內(nèi)容~");
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可尋址系統(tǒng) – 資源加載和釋放 – 進階(二)文章來源:http://www.zghlxwxcb.cn/news/detail-795273.html
TODO:下一篇 --> Unity 之 Addressable可尋址系統(tǒng) – 資源熱更新 – 進階(四)文章來源地址http://www.zghlxwxcb.cn/news/detail-795273.html
到了這里,關(guān)于Unity 之 Addressable可尋址系統(tǒng) -- 資源遠程加載 | 資源預下載 -- 進階(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!