接着上一篇继续写,我这边做了一个简易的加载界面 ,从资源服加载,加载完成之后 进登录 直接看效果吧
这是CDN 资源
第一次进去 游戏
下载资源的log 输出
这是登录界面,现在我改一下登录界面 直接在登录界面加两个icon
然后打一下热更, 选择
Update a Previous Build ,然后选择对应平台的bin 文件 ,然后这三个文件都要上传资源服 ,其中是catalog 的hash 和json ,还有对应的热更包
最终打开之前的apk
有更新 也能正常看到你改之后的效果 ,OK 这就是Addressables 的基本加载流程,直接上代码如下
private Slider slider;
GameObject loadingPanel;
void Start()
{
var handle = Addressables.LoadAssetAsync<GameObject>("Assets/Art/Prefab/LoadingPanel.prefab");
handle.Completed += (obj) =>
{
loadingPanel= Instantiate<GameObject>(obj.Result, this.transform);
slider = transform.Find("LoadingPanel(Clone)/Slider").GetComponent<Slider>();
slider.value = 0;
// 默认自动执行一次更新检测
StartCoroutine(DoUpdateAddressadble());
};
DontDestroyOnLoad(this);
}
IEnumerator DoUpdateAddressadble()
{
AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync();
yield return initHandle;
// 检测更新
var checkHandle = Addressables.CheckForCatalogUpdates(false);
yield return checkHandle;
if (checkHandle.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError($"CheckForCatalogUpdates Error{checkHandle.OperationException.ToString()}");
yield break;
}
if (checkHandle.Result.Count > 0)
{
var updateHandle = Addressables.UpdateCatalogs(checkHandle.Result, false);
yield return updateHandle;
if (updateHandle.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError($"UpdateCatalogs Error{updateHandle.OperationException.ToString()}");
yield break;
}
// 更新列表迭代器
List<IResourceLocator> locators = updateHandle.Result;
foreach (var locator in locators)
{
List<object> keys = new List<object>();
foreach (var key in locator.Keys)
{
if (key is string)
{
keys.Add(key);
}
}
var sizeHandle = Addressables.GetDownloadSizeAsync(keys);
yield return sizeHandle;
if (sizeHandle.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError($"GetDownloadSizeAsync Error{sizeHandle.OperationException.ToString()}");
yield break;
}
long totalDownloadSize = sizeHandle.Result;
Debug.Log("download size : " + totalDownloadSize);
if (totalDownloadSize > 0)
{
// 下载
var downloadHandle = Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union);
while (!downloadHandle.IsDone)
{
if (downloadHandle.Status == AsyncOperationStatus.Failed)
{
Debug.LogError($"DownloadDependenciesAsync Error{downloadHandle.OperationException.ToString()}");
yield break;
}
// 下载进度
float percentage = downloadHandle.PercentComplete;
Debug.Log($"已下载: {percentage}");
slider.value = percentage;
yield return null;
}
if (downloadHandle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("下载完毕!");
slider.value = 1f;
}
}
else
{
Debug.Log("无下载");
slider.value = 1f;
}
}
}
else
{
Debug.Log("没有检测到更新!");
slider.value = 1f;
}
// 进游戏
EnterGame();
}
// 进游戏
void EnterGame()
{
var handle = Addressables.LoadAssetAsync<GameObject>("Assets/Art/Prefab/LoginPanel.prefab");
handle.Completed += (obj) =>
{
loadingPanel.SetActive(false);
Instantiate<GameObject>(obj.Result, this.transform);
};
}
OK Addressables 就先告一段落,接下来,我会在Addressables 里面加 HybridCLR ,大家敬请期待,有什么不对的地方 欢迎大家来指正哈