Addressable-加载指定资源

1、Addressables中的资源标识类

  • AssetReference                通用资源标识类 可以用来加载任意类型资源
  • AssetReferenceAtlasedSprite   图集资源标识类
  • AssetReferenceGameObject      游戏对象资源标识类
  • AssetReferenceSprite          精灵图片资源标识类
  • AssetReferenceTexture         贴图资源标识类
  • AssetReferenceTexture2D
  • AssetReferenceTexture3D
  • AssetReferenceT<>             指定类型标识类

通过不同类型标识类对象的申明 我们可以在Inspector窗口中筛选关联的资源对象

2、加载资源

注意:所有Addressables加载相关都使用异步加载
需要引用命名空间:using UnityEngine.ResourceManagement.AsyncOperations;

AsyncOperationHandle<GameObject> handle = assetReference.LoadAssetAsync<GameObject>();
handle.Completed += CompleteFunc;

加载成功后使用

  1. 通过事件函数传入的参数判断加载是否成功并且创建(handle.Status)
  2. 通过资源标识类对象判断 并且创建(assetReference.IsDone)

3、加载场景

sceneReference.LoadSceneAsync().Completed += (handle) =>{};

4、释放资源

assetReference.ReleaseAsset();

一定要资源加载过后,使用完成后再去释放 

  1. 释放资源方法后,资源标识类中的资源 (assetReference.Asset) 会置空,但是AsyncOperationHandle类中的对象 (handle.Result) 不为空
  2. 释放资源不会影响场景中被实例化出来的对象,但是会影响使用的资源,比如加载了一个预制件,然后释放资源,那么实例出来的预制件不会有影响,但是如果在预制件生成后再加载一个材质球并赋值给刚刚加载的预制件,然后再释放材质球的资源,那么预制件的材质球会丢失(Play Mode Script 需要是 Use Exsiting Build 才有可能生效)

5、直接实例化对象

AssetReferenceGameObject 的 InstantiateAsync 方法

6、自定义标识类(老版)

自定义类,比如继承AssetReferenceT<Material>类 即可自定义一个指定类型的标识类
该功能主要用于Unity2020.1之前,因为之前的版本不能直接使用AssetReferenceT泛型字段

### 使用Unity Addressable Asset System加载资源 #### 初始化Addressables系统 为了确保`Addressables`初始化完成,通常会在场景启动时调用一次`InitializeAsync()`方法。此操作应该尽可能早地执行,理想情况下是在游戏启动期间。 ```csharp using UnityEngine; using UnityEngine.AddressableAssets; public class InitAddressables : MonoBehaviour { async void Start() { await Addressables.InitializeAsync(); } } ``` #### 加载单个对象 当需要加载特定类型的单一资源实例时,可以使用`LoadAssetAsync<T>()`函数。这里展示了一个简单的例子,其中尝试加载名为`exampleSprite`的精灵图[^1]。 ```csharp async Task<Sprite> LoadSingleSprite(string label) { var handle = Addressables.LoadAssetAsync<Sprite>(label); Sprite sprite = await handle.Task; return sprite; } ``` #### 卸载不再使用的资源 一旦某个资源不再被需要,应当及时释放其占用的空间。可以通过调用`Release(T)`来实现这一点。这对于减少内存消耗非常重要[^2]。 ```csharp void UnloadUnusedResources(Sprite loadedSprite, AsyncOperationHandle loadHandle) { Addressables.Release(loadHandle); // 或者如果你已经有了具体的引用可以直接这样做 // Addressables.Release(loadedSprite); } ``` #### 批量加载多个资源 有时可能希望一次性获取一组同类型或不同类型的对象列表。这时就可以利用`LoadAssetsAsync<T>()`来进行批量处理[^3]。 ```csharp async Task<List<AudioClip>> LoadMultipleAudioClips(List<string> labels) { List<AsyncOperationHandle<AudioClip>> handles = new List<AsyncOperationHandle<AudioClip>>(); foreach (var label in labels) { handles.Add(Addressables.LoadAssetAsync<AudioClip>(label)); } await Task.WhenAll(handles.Select(h => h.Task)); List<AudioClip> clips = handles.Select(handle => handle.Result).ToList(); // 记得清理handle foreach(var handle in handles){ Addressables.Release(handle); } return clips; } ``` #### 异步加载场景 除了常规的游戏内物体外,还可以通过`LoadSceneMode.Single`参数指定模式来异步加载整个场景[^4]。 ```csharp async Task.LoadSceneByName(string sceneName) { SceneInstance instance; AsyncOperationHandle op = Addressables.LoadSceneAsync(sceneName, out instance, true); await op.Task; Debug.Log($"Loaded {sceneName} with build index {instance.Scene.buildIndex}"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值