由于项目工程中实际使用的其他下载方式下载,所以配置为本地编译本地加载
image.png
如需配置从云端加载也可以在hosting里面配置模拟
image.png
第一步: 调试好各个场景以及参数
然后将场景以及自动生成的一些灯光信息添加至group里面
image.png
第二步: 进行编译
image.png至此资源文件基本准备完毕,开始coding过程
第三步: 当需要加载场景时下载资源包
using UnityEngine.SceneManagement;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
private AsyncOperationHandle m_SceneHandle;
private AsyncOperation asyncOperation;
private void shuimohei()
{
curretnTheme = "shuimohei";
m_SceneHandle = Addressables.DownloadDependenciesAsync(curretnTheme);
m_SceneHandle.Completed += OnSceneLoaded;
}
private void OnSceneLoaded(AsyncOperationHandle obj)
{
// We show the UI button once the scene is successfully downloaded
if (obj.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("download Succeeded");
}
else
{
Debug.Log("download Fail");
}
}
第四步: 加载下载完毕的场景
private void startLoad()
{
Addressables.LoadSceneAsync(curretnTheme, UnityEngine.SceneManagement.LoadSceneMode.Single, true);
DynamicGI.UpdateEnvironment();
}
五、其他(如果是加载其他图片或者预制体资源)
//address为资源所在的目录
//比如下面这个cube的目录就为 Assets/Prefabs/Cube.prefab
Addressables.LoadAssetAsync<GameObject>(address).Completed +=
(op) =>
{
if (op.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("load gameobj Succeeded");
Debug.Log(op.Result as GameObject);
var go = Instantiate(op.Result as GameObject, Vector3.zero, Quaternion.identity, transform);
go.transform.localPosition = Vector3.zero;
}
else
{
Debug.Log("load gameobj error");
}
};
image.png
更改资源的加载路径
image.png添加自定义目录
image.png注意: Native 需要配置以/mnt 开头的绝对路径
例如 : /app/data
资源加载:
//使用LoadAssetAsync方法来加载单个资源,通常会用地址作为key。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
internal class LoadAddress : MonoBehaviour
{
public string key;
AsyncOperationHandle<GameObject> opHandle;
public IEnumerator Start() {
//普通加载资源
opHandle = Addressables.LoadAssetAsync<GameObject>(key);
yield return opHandle;
if (opHandle.Status == AsyncOperationStatus.Succeeded) {
GameObject obj = opHandle.Result;
Instantiate(obj, transform);
}
}
void OnDestroy() {
Addressables.Release(opHandle);
}
}
加载多个资源
使用LoadAssetsAsync这个方法可以一次性加载多个资源,这个方法除了传Keys以外,还可以传merge mode来如何去组合每个key的结果
- Union:包含所有匹配的资源
- Intersection:只包含同时满足所有keys的资源
- UseFirst:只包含第一个key的
public List<string> keys = new List<string>() { "characters", "animals" };
AsyncOperationHandle<IList<GameObject>> loadHandle = Addressables.LoadAssetsAsync<GameObject>(
keys,
addressable => {
//Gets called for every loaded asset
Instantiate<GameObject>(addressable,
new Vector3(x++ * 2.0f, 0, z * 2.0f),
Quaternion.identity,
transform);
if (x > 9) {
x = 0;
z++;
}
}, Addressables.MergeMode.Union, // How to combine multiple labels
false); // Whether to fail and release if any asset fails to load
Scenes
由于引擎限制,在用Addressables.LoadSceneAsync加载场景的时候,是不能用Addressables.LoadSceneAsync的WaitForCompletion来获取结果的,这是因为这个会等到所有依赖加载完成,但是场景的激活必须是异步的。
但是可以通过sceneHandle的来实现。如下
IEnumerator LoadScene(string myScene)
{
var sceneHandle = Addressables.LoadSceneAsync(myScene, LoadSceneMode.Additive);
SceneInstance sceneInstance = sceneHandle.WaitForCompletion();
yield return sceneInstance.ActivateAsync();
//Do work... the scene is now complete and integrated
}
Note:
场景的卸载不能用同步的方式。在卸载的时候调用WaitForCompleted会导致资源和场景都没有卸载。
另外,由于Single模式下,SceneManager会在下个场景加载前先调用UnloadUnusedAssets,但是 第二个场景的加载调用WaitForCompletion 又会阻塞主线程,就会造成死锁。
Catalog的生成
image.png注意路径
shaderMD5的修改
image.png image.png
网友评论