Unity AddressableAssets 实例化(二)

通过label和address name加载

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;

public class CreateAsset : MonoBehaviour
{
    [SerializeField] private string _label=null;
    [SerializeField] private string _assetName=null;//Address name

    private List<GameObject> Assets { get; } = new List<GameObject>();

    private void Start()
    {
        StartCoroutine(waitUntil());
    }
    IEnumerator waitUntil()
    {
        yield return CreateAndWaitUntilCompleted();
    }
    private async Task CreateAndWaitUntilCompleted()
    {
        await CreateAddressableLoader.InitAsset(_label, Assets);
        await CreateAddressableLoader.InitAsset(_assetName, Assets);
        for (int i = 0; i < Assets.Count; i++)
        {
            Debug.Log(Assets[i].name);
        }
        await Task.Delay(TimeSpan.FromSeconds(5));

         CleanUpFinishedAssets(Assets[0]);
    }
    private async Task CleanUpFinishedAssets(UnityEngine.Object obj)
    {
        Addressables.Release(obj);
    }
}
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;

public static class CreateAddressableLoader
{
    public static async Task InitAsset<T>(string nameOrLabel,List<T> createdObjs)where T:Object
    {
        var loactions = await Addressables.LoadResourceLocationsAsync(nameOrLabel).Task;
        for (int i = 0; i < loactions.Count; i++)
        {
            createdObjs.Add(await Addressables.InstantiateAsync(loactions[i]).Task as T);
        }
    }
}

 

### Unity 资源管理教程和最佳实践 #### 使用 `Addressable Assets` 进行资源管理 为了更好地管理和加载游戏中的资产,推荐使用 Addressables 系统。该系统提供了灵活的方式处理依赖关系并支持按需下载内容,从而减少初始包体大小以及提高性能[^1]。 ```csharp using UnityEngine; using UnityEngine.AddressableAssets; public class AssetLoader : MonoBehaviour { async void LoadSpriteAsync(string assetKey) { Sprite sprite = await Addressables.LoadAssetAsync<Sprite>(assetKey).Task; // Use the loaded sprite here... } } ``` #### 减少对 `Resources` 文件夹的依赖 尽管 Unity 提供了内置的 Resources API 来简化某些场景下的开发工作流,但这并不是最优的选择。过度依赖此功能可能导致不必要的内存占用和其他潜在问题。因此,在现代项目中应尽量避免大量采用这种方式来存储或访问素材文件[^3]。 #### 实施对象池模式以优化瞬态实例化操作 对于频繁创建销毁的游戏物体(如子弹),可以考虑构建一个简单的对象池机制。这有助于降低垃圾回收压力,并且能够显著改善运行效率特别是当面对高频率更新的对象时尤为明显。 ```csharp using System.Collections.Generic; using UnityEngine; public static class ObjectPool<T> where T : Component, new() { private readonly Queue<T> _pool = new(); public T GetObject(Transform parentTransform){ if (_pool.Count > 0) return _pool.Dequeue(); var go = new GameObject(typeof(T).Name); go.transform.SetParent(parentTransform); return go.AddComponent<T>(); } public void ReturnObjectToPool(T obj){ obj.gameObject.SetActive(false); _pool.Enqueue(obj); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值