直接上代码
示例代码如下:`.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.AddressableAssets.ResourceLocators;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
public class AddressableMain : MonoBehaviour
{
public Button btn;
public InputField inp;
public RawImage img;
public Button freeResBtn;
public Texture2D tex2D;
private AsyncOperationHandle<Texture2D> handle;
private AsyncOperationHandle<GameObject> handle1;
private GameObject gam;
void Start()
{
btn.onClick.AddListener(() => BtnClick(inp.text));
freeResBtn.onClick.AddListener(() => BtnShif(inp.text));
}
private void BtnClick(string name)
{
//handle = Addressables.LoadAssetAsync<Texture2D>(name);
//handle.Completed += OnLoadCompleted;
//不能用这个方式加载,用它加载不能完全释放不能动态新增资源
//Addressables.LoadAssetAsync<GameObject>(name).Completed += (obj) =>
//{
// gam = obj.Result;
// Instantiate(gam);
//};
//用这个方式加载资源
handle1 = Addressables.LoadAssetAsync<GameObject>(name);
handle1.Completed += OnLoadCompleted1;
}
void OnLoadCompleted(AsyncOperationHandle<Texture2D> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
tex2D = obj.Result;
img.texture = tex2D;
}
else
{
Debug.LogError("Failed to load asset: " + obj.OperationException.ToString());
}
}
void OnLoadCompleted1(AsyncOperationHandle<GameObject> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
gam = obj.Result;
Instantiate(gam);
}
else
{
Debug.LogError("Failed to load asset: " + obj.OperationException.ToString());
}
}
private void BtnShif(string name)
{
StartCoroutine(gengxindizhi(name));
}
public IEnumerator gengxindizhi(string name)
{
//重点就是下面这个方法重新加载资源列表
yield return UpdateCatalog(name);
Addressables.Release(handle1);
if(gam!=null)
Addressables.Release(gam);
//这个方法是释放缓存
Addressables.ClearDependencyCacheAsync(name);
}
}
新加代码在不同路径下的资源加载不同的catalog去定位资源:
private IEnumerator UpdateCatalog(string name)
{
string themeName = name;
int index = name.IndexOf('_');
if (index >= 0)
{
themeName = name.Substring(0, index);
}
string catalogPath = themeName + "/catalog.json";
if (!File.Exists(catalogPath))
{
//没有加加载默认路径的
catalogPath = "catalog.json";
}
Debug.Log(string.Format("addressablecatalogs::::::" + catalogPath));
//清楚资源定位器
Addressables.ClearResourceLocators();
//异步加载内容
var catalogHandle = Addressables.LoadContentCatalogAsync(catalogPath, false);
//等待加载完成
catalogHandle.WaitForCompletion();
//方法用于检查是否有可用的地址目录更新
AsyncOperationHandle<List<string>> checkHandle = Addressables.CheckForCatalogUpdates(false);
yield return checkHandle;
if (checkHandle.Status == AsyncOperationStatus.Succeeded)
{
List<string> catalogs = checkHandle.Result;
if (catalogs != null && catalogs.Count > 0)
{
var updateHandle = Addressables.UpdateCatalogs(catalogs, false);
yield return updateHandle;
Debug.Log("获取更新完成!");
}
else
{
Debug.Log("不需要更新!");
}
}
else
{
Debug.Log("获取更新失败!");
}
Addressables.Release(checkHandle);
}
替换新资源后,先释放,在加载新资源就能成功了。
这里crc的设置要改
remoteloadpath路径要输入这个http://[PrivateIpAddress]:[HostingServicePort]