Unity Addressables加载资源方式汇总

10 篇文章 0 订阅
7 篇文章 0 订阅

案例工程

加载方式

异步加载的方式:
[加载分配的Sprite或Atlas的方法].Completed+ = [加载Sprite后要执行的代码];
[加载指定的Sprite或Atlas的方法]随Sprite类型和分配方法而变化。
[Sprite加载后将执行的代码]可以是委托,也可以是lambda表达式(在较简单的情况下)。

用加载sprite为例

使用可寻址对象加载
using UnityEngine;
using System.Collections;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;
public class SpriteLoader : MonoBehaviour
{
    public AssetReferenceSprite newSprite;
    private SpriteRenderer spriteRenderer;
    // Use this for initialization
    void Start()
    {
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
        newSprite.LoadAssetAsync().Completed += SpriteLoaded;
    }
    private void SpriteLoaded(AsyncOperationHandle<Sprite> obj)
    {
        switch (obj.Status)
        {
            case AsyncOperationStatus.Succeeded:
                spriteRenderer.sprite = obj.Result;
                break;
            case AsyncOperationStatus.Failed:
                Debug.LogError("Sprite load failed.");
                break;
            default:
                //case AsyncOperationStatus.None: 
                break;
        }
    }
}

在这里插入图片描述

使用地址直接加载
using UnityEngine;
using System.Collections;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;
public class SpriteLoadFromPath : MonoBehaviour
{
    public string newSpriteAddress;
    public bool useAddress;
    public AssetReferenceSprite newSprite;
    private SpriteRenderer spriteRenderer;
    // Use this for initialization
    void Start()
    {
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
        if (useAddress)
            Addressables.LoadAssetAsync<Sprite>(newSpriteAddress).Completed += SpriteLoaded;
        else
            newSprite.LoadAssetAsync().Completed += SpriteLoaded;
    }
    private void SpriteLoaded(AsyncOperationHandle<Sprite> obj)
    {
        switch (obj.Status)
        {
            case AsyncOperationStatus.Succeeded:
                spriteRenderer.sprite = obj.Result;
                break;
            case AsyncOperationStatus.Failed:
                Debug.LogError("Sprite load failed.");
                break;
            default:
                break;
        }
    }
}

在这里插入图片描述
加载图集
在这里插入图片描述

Unity官方:
如果同时将Sprite Atlas和源Sprite
Textures标记为可寻址,则最终的AssetBundle将包含重复的数据。有一个Addressables
Analyze规则可以检测到这一点。在这种情况下,我们建议仅将Sprite Atlas标记为可寻址。

using UnityEngine;
using System.Collections;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;
public class SpriteAtlasLoader : MonoBehaviour
{
    public AssetReferenceAtlasedSprite newAtlasedSprite; 
    public string spriteAtlasAddress; 
    public string atlasedSpriteName; 
    public bool useAtlasedSpriteName; 
    private SpriteRenderer spriteRenderer;
    // Use this for initialization
    void Start()
    {
        //①
        //spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
        //if (useAtlasedSpriteName)
        //{
        //    string atlasedSpriteAddress = spriteAtlasAddress + '[' + atlasedSpriteName + ']';
        //    Addressables.LoadAssetAsync<Sprite>(atlasedSpriteAddress).Completed += SpriteLoaded;
        //}
        //else
        //    Debug.Log(newAtlasedSprite.editorAsset.name);
        //    newAtlasedSprite.LoadAssetAsync<Sprite>().Completed += SpriteLoaded;
        //②
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
        Addressables.LoadAssetAsync<SpriteAtlas>(spriteAtlasAddress).Completed += SpriteAtlasLoaded;
    }
    private void SpriteLoaded(AsyncOperationHandle<Sprite> obj)
    {
        switch (obj.Status)
        {
            case AsyncOperationStatus.Succeeded:
                spriteRenderer.sprite = obj.Result;
                break;
            case AsyncOperationStatus.Failed:
                Debug.LogError("Sprite load failed.");
                break;
            default:
                break;
        }
    }
    private void SpriteAtlasLoaded(AsyncOperationHandle<SpriteAtlas> obj)
    {
        switch (obj.Status)
        {
            case AsyncOperationStatus.Succeeded:
                Debug.Log(obj.Result.spriteCount);
                spriteRenderer.sprite = obj.Result.GetSprite(atlasedSpriteName); 
                break;
            case AsyncOperationStatus.Failed: 
                Debug.LogError("Sprite load failed. Using default Sprite."); 
                break;
            default: // case AsyncOperationStatus.None: 
                break; 
        } 
    }
}

加载场景
在这里插入图片描述

public AssetReference Scene;

 //加载场景
Scene.LoadSceneAsync().Completed += SceneLoaded;


private void SceneLoaded(AsyncOperationHandle<SceneInstance> obj)
{
    switch (obj.Status)
    {
        case AsyncOperationStatus.None:
            break;
        case AsyncOperationStatus.Succeeded:
            Scene.LoadSceneAsync(UnityEngine.SceneManagement.LoadSceneMode.Additive);
            break;
        case AsyncOperationStatus.Failed:
            break;
    }
}
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity Addressables 在 WebGL 平台加载缓慢的原因有多个方面。 首先,WebGL 平台是基于浏览器的运行环境,相比于本地平台,存在网络传输和解析字节码的延迟。这会导致加载和解析资源的时间增加,从而使 Unity Addressables加载速度变慢。 其次,WebGL 平台受到浏览器的安全限制和网络环境的影响,可能会导致网络通信速度减慢。尤其是当需要从远程服务器获取资源时,网络延迟和带宽限制可能会增加资源加载的时间。 此外,WebGL 平台的硬件设备和浏览器版本碎片化也会影响 Addressables加载速度。不同的硬件设备和浏览器版本对于资源加载和渲染效率可能有所差异,因此可能需要额外的适配和优化工作。 为了缓解 Unity Addressables 在 WebGL 平台的加载缓慢问题,可以考虑以下几个方面的优化: 1. 减少资源的大小和数量,避免不必要的资源加载和解析时间。 2. 使用压缩格式的资源,以减小资源文件的大小,并加快网络传输速度。 3. 尽量避免远程加载资源,可以将资源预先打包到 WebGL 构建中,减少网络传输时间。 4. 在资源加载之前,展示加载中的提示信息或动画,让用户意识到加载需要一定的时间,提高用户体验。 5. 针对 WebGL 平台进行性能优化,如使用适当的渲染技术、减少渲染批次等,提高整体性能。 需要注意的是,不同的项目和情况可能需要针对性的优化方法,可以综合考虑以上建议并结合具体情况进行优化工作,以提高 Unity Addressables 在 WebGL 平台的加载速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值