Unity Addressables 的使用

本文详细探讨了Unity中Addressables系统的使用方法,包括资源加载、实例化及回收流程。介绍了如何利用AssetReference实现资源的灵活加载,即使资源路径或名称改变,也能确保代码的稳定性。此外,还讲解了通过Key和Label进行资源定位的技巧,以及关键资源的管理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1简单使用

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.SceneManagement;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class Spawner : MonoBehaviour
{
    public AssetReference prefabToLoad;
    public AssetReference prefabToLoad2;
    public GameObject instantiate1;
    public GameObject instantiate2;

    // Start is called before the first frame update
    void Start()
    {
        Addressables.LoadAssetAsync<GameObject>(prefabToLoad).Completed += LoadedObject;
    }

    private void LoadedObject(AsyncOperationHandle<GameObject> obj)
    {
        if(obj.Status == AsyncOperationStatus.Succeeded)  //如果将资源读到了内存
        {
            instantiate1 = Instantiate<GameObject>(obj.Result); //实例化资源

            //并且使用另一个方法,来直接读取实例化 
          
            prefabToLoad2.InstantiateAsync(instantiate1.transform).Completed += handle =>
            {
                if (handle.Status == AsyncOperationStatus.Succeeded)
                {
                    instantiate2 = handle.Result;
                    Debug.Log("附属物体加载成功");
                }
            };
           
            

        }
    }

}

 

2 很重要的一点

看Addressable的介绍时,他说只要把资源标记为addressable,不管你是移动、改名字,你原先对该资源的加载代码都不需要更改。

通过上面的AssetReference可以知道,你把资源标记为addressable,然后挂在AssetRefence属性上,确实可以移动、改名字,然后加载代码不需要更改,因为AssetRefence这个字段就直接指向了资源,我只需要以这个字段为参数进行加载就OK。

但是这不是我想要的。

我想要的是原先类似于Resources.Load("Sprites/Charater01")这样的 靠路径加载的方式。

但是如果靠路径进行加载的话,资源移动了,路径更改了,肯定就加载不了了。代码必须得改。

而Addressable里面,他除了给你的资源跟踪路径,还可以给你的资源设置Key。只要你的资源的这个Key不更改,那么无论改路径还是改名字,通过这个Key加载的代码都不需要更改。

 

举个例子

这是Addressable Group界面

在prefabs 组里面,有一个cube,后面的Assets/Cube.prefab就是它目前的地址。加载这个Cube可以使用两种方式加载。

一种是绝对路径加载Addressables.LoadAssetAsync<GameObject>("Assets/Cube.prefab")

还有一种就是通过key加载  Addressables.LoadAssetAsync<GameObject>("Cube")  

使用key加载,要你的资源的这个Key不更改,那么无论改路径还是改名字,通过这个Key加载的代码都不需要更改。

 

-----------------------------------------------------------------------

下面就这个key展开我的脑洞

1两个资源具有同一个key,但是在不同的组里

这样的话,如果我加载Cube,会只加载位于上面组的资源,路径为"Assets/Cube.prefab"的这个

 

2两个资源具有同一个key,但是在同一个组里

还是只会加载位于上面的资源,路径为"Assets/Cube.prefab"的这个。

 

总结就是,遇到同名的key的资源,只会选择一个加载。选择的逻辑就是 排在最上面的组的最上面的一个同名key资源。

 

 

3 通过key和label 共同加载

https://blog.youkuaiyun.com/zhenghongzhi6/article/details/103334939

讲的很清楚

 4 Release

Addressables里面有release的方法进行实例化回收和资源释放。

 

 

Unity中,Addressables系统是一个强大的资源管理系统,允许开发者更方便地管理游戏资源。使用Addressables系统时,可以结合ScriptableObject来组织和存储资源数据,从而实现更灵活和高效的资源管理。 以下是使用Addressables结合ScriptableObject的一些步骤和示例: ### 步骤1:创建ScriptableObject 首先,创建一个继承自ScriptableObject的类,用于存储资源地址或其他相关数据。 ```csharp using UnityEngine; [CreateAssetMenu(fileName = "AddressableData", menuName = "ScriptableObjects/AddressableData", order = 1)] public class AddressableData : ScriptableObject { public string address; } ``` ### 步骤2:创建ScriptableObject实例 在Unity编辑器中,右键点击Project窗口,选择`Create -> ScriptableObjects -> AddressableData`,创建一个ScriptableObject实例,并设置其地址。 ### 步骤3:使用Addressables加载资源 在代码中使用Addressables系统加载资源时,可以引用ScriptableObject中的地址。 ```csharp using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; public class AddressableLoader : MonoBehaviour { public AddressableData addressableData; void Start() { LoadAssetAsync(); } void LoadAssetAsync() { AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(addressableData.address); handle.Completed += OnLoadCompleted; } void OnLoadCompleted(AsyncOperationHandle<GameObject> handle) { if (handle.Status == AsyncOperationStatus.Succeeded) { Instantiate(handle.Result); } else { Debug.LogError("Failed to load asset"); } } } ``` ### 步骤4:在场景中设置 在场景中,将上述脚本挂载到一个GameObject上,并将创建的ScriptableObject实例拖拽到脚本的`addressableData`字段中。 通过这种方式,可以方便地管理和加载资源,并且可以轻松地在编辑器中进行配置和管理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值