Unity之Addressable使用注意事项

这篇具有很好参考价值的文章主要介绍了Unity之Addressable使用注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本设置

Profile文件中配置资源构建路径和资源首次加载路径,资源如何设置了缓存,在首次加载之后会将再用缓存在缓存目录,后面将直接从缓存目录中读取,方便项目发包时候进行使用
Unity之Addressable使用注意事项

AddressableAssetSettings文件
DisableCatalogUpdateOnStartup 勾选改选项,禁止自动更新,项目资源下载一般需要提示玩家下载资源大小和下载进度,需要通过代码进行手动下载更新
BuildRemoteCatalog 创建远端资源的catalog,用于热更新资源
设置BuildPath和 LoadPath
根据自身网络状况设置资源最大的请求数和下载超时时间
Unity之Addressable使用注意事项
Group文件注意设置BundleMode ,是否将group内的资源分散打包
Unity之Addressable使用注意事项

Remote资源缓存

unity自身默认缓存路径是 C:\Users\admin\AppData\LocalLow\Unity
Addressable默认缓存路径 C:\Users\admin\AppData\LocalLow\Unity\项目名称_AdressableLoad
可以指定远端远端资源在本地缓存路径,需要注意的是,如果项目刚开始运行的时候没有手动设置缓存目录,在手动添加缓存目录之后默认缓存目录中已经存在的资源并不会被释放,每次加载读取的时候,先从手动设置的缓存目录中查找,在从默认缓存中查找,如果默认缓存中存在资源,则不会重新进行下载
创建CacheInitializationSettings文件,然后将改文件关联到AddressableAssetSettings的inititalizationObjects中,方法如下
Unity之Addressable使用注意事项
Unity之Addressable使用注意事项

手动设置缓存路径(如下图所示方式会缓存在工程根目录的AAAAAAA文件夹内,也可设置为 persistentDataPath 格式为{UnityEngine.Application.persistentDataPath})

Unity之Addressable使用注意事项
Unity之Addressable使用注意事项

每一个下载下来的bundle资源,会被缓存为_data 和_info两个文件,(猜测:_info是索引文件信息,_data是资源序列化内容)
Unity之Addressable使用注意事项

代码部分

资源下载检测

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableManager : MonoBehaviour
{
    public static AddressableManager instance;
    List<object> keys;//addressable ×ÊÔ´µÄlabel¼¯ºÏ£¬Ò»°ãͬһÀàÐ͵Ä×ÊÔ´ÓÃÒ»¸ölabel
    AsyncOperationStatus checkStatus;
    long totalDownloadSize = 0;
    public event Action<AsyncOperationStatus> onCheckFinish;

    // Start is called before the first frame update
    private void Awake()
    {
        instance = this;
        DontDestroyOnLoad(this.gameObject);
    }
    

    public IEnumerator CheckUpadate()
    {
        keys = new List<object>();
        totalDownloadSize = 0;
        yield return Addressables.InitializeAsync();
        Debug.Log("初始化检测更新");
        var checkHandle = Addressables.CheckForCatalogUpdates(false);//false是手动释放异步结果对象
        yield return checkHandle;
        Debug.Log("catalogs chek res:" + checkHandle.Status);
        if(checkHandle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
        {
            List<string> catalogs = checkHandle.Result;
           
            if(catalogs != null && catalogs.Count > 0)
            {
                var updateHandle = Addressables.UpdateCatalogs(catalogs, false);
                yield return updateHandle;

                var catlogResult = updateHandle.Result;
                int idx = 0;
                foreach (var item in catlogResult)
                {
                    // var itemKeys = new List<object> { item.Keys };
                    // for (int i = 0; i < itemKeys.Count; i++)
                    // {
                    //     Debug.Log($"index:{idx},key:{itemKeys[i]}");
                    // }
                    foreach (var key in item.Keys)
                    {
                        if (key is string)
                        {
                            // if (!itemKeys.Any(x => x == key.ToString()))
                                keys.Add(key.ToString());
                        }
                    }
                    
                }
                // keys = new List<object> { catlogResult[0].Keys };
                Debug.Log("updatehandle res:" + updateHandle.Status);
                Debug.Log("updatehandle res:" + keys[0].ToString());
                if (updateHandle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
                {
                    var sizeHandle = Addressables.GetDownloadSizeAsync(keys);
                    yield return sizeHandle;
                    if(sizeHandle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
                    {
                        totalDownloadSize = sizeHandle.Result;
                        Debug.Log("下载资源大小" + (totalDownloadSize / 1024.0f / 1024.0f).ToString("0.00"));
                        checkStatus = AsyncOperationStatus.Succeeded;
                        CheckForUpdate(); 
                    }
                    else
                    {
                        checkStatus = AsyncOperationStatus.Failed;
                        CheckForUpdate();
                    }
                    Addressables.Release(sizeHandle);
                }
                else
                {
                    Debug.Log("¼ì²â¸üÐÂʧ°Ü£¬Çë¼ì²éÍøÂç×´¿ö");
                    checkStatus = AsyncOperationStatus.Failed;
                    CheckForUpdate();
                }
                Addressables.Release(updateHandle);

            }
            else
            {
                Debug.Log("不需要更新catlog");
                keys.Add("HD");
                keys.Add("Movie");
                var sizeHandel = Addressables.GetDownloadSizeAsync(keys);
                yield return sizeHandel;
                if(sizeHandel.Status == AsyncOperationStatus.Succeeded)
                {
                    totalDownloadSize = sizeHandel.Result;
                    Debug.Log("下载资源大小" + (totalDownloadSize / 1024.0f / 1024.0f).ToString("0.00"));
                    checkStatus = AsyncOperationStatus.Succeeded;
                    CheckForUpdate();
                }
                else
                {
                    Debug.Log("资源大小获取失败");
                    checkStatus = AsyncOperationStatus.Failed;
                    CheckForUpdate();
                }
                Addressables.Release(sizeHandel);
            }
        }

    }

     void CheckForUpdate()
    {
        if(checkStatus == AsyncOperationStatus.Succeeded && totalDownloadSize > 0)
        {
            StartCoroutine(ExcuteUpdate());
        }else onCheckFinish?.Invoke(checkStatus);
    }

    IEnumerator ExcuteUpdate()
    {
        var downloadDependenciesHandle = Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, false);//Addressables.DownloadDependenciesAsync(keys, false);
            while (downloadDependenciesHandle.Status == AsyncOperationStatus.None)
            {
                Debug.Log("当前下载进度:" + downloadDependenciesHandle.GetDownloadStatus().Percent);
                 yield return null;
            }
            if (downloadDependenciesHandle.Status == AsyncOperationStatus.Succeeded)
            {
                Debug.Log("download success");
            }
            else Debug.Log("download failed");
            Addressables.Release(downloadDependenciesHandle);    
            onCheckFinish?.Invoke(checkStatus);
    }

    /// <summary>
    /// »ñÈ¡µ¥¸ökey¶ÔÓ¦×ÊÔ´ÏÂÔØ´óС
    /// </summary>
    /// <param name="key"></param>
    /// <param name="onComplete"></param>
    /// <param name="onfailed"></param>
    public void GetDownloadSize(object key, Action<long> onComplete, Action onfailed = null)
    {
        var sizeHandle = Addressables.GetDownloadSizeAsync(key.ToString());
        sizeHandle.Completed += (result) => {
            if (result.Status == AsyncOperationStatus.Succeeded)
            {
                var downloadSize = result.Result;
                onComplete?.Invoke(downloadSize);
            }
            else onfailed?.Invoke();
            Addressables.Release(sizeHandle);
        };
    }
     public AsyncOperationHandle Download(object key, Action onComplete, Action onFailed   = null)
    {
        var downloadHandle = Addressables.DownloadDependenciesAsync(key.ToString(), true);
        downloadHandle.Completed += (result) => {
            if (result.Status == AsyncOperationStatus.Succeeded)
            { 
                onComplete?.Invoke();
            }
            else onFailed?.Invoke();
        };
        return downloadHandle;
    }
}

资源加载

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AssetManager : MonoBehaviour
{
    public AssetReference assetReference;
    [AssetReferenceUILabelRestriction("HD")]
    public AssetReference assetReferenceHD;
    public AssetReferenceGameObject assetReferenceGameObject;
    public AssetReferenceT<Texture> textureAsset;

    //private void Awake()
    //{
    //    Debug.Log("");
    //}

    void Start()
    {
        //AsyncOperationHandle<GameObject> res = assetReferenceGameObject.LoadAssetAsync();
        //res.Completed += Res_Completed;
        DontDestroyOnLoad(this.gameObject);
        // LoadByName("Prefab1");
        
        AddressableManager.instance.onCheckFinish += Instance_onCheckFinish;
        StartCoroutine(AddressableManager.instance.CheckUpadate());
    }

    private void Instance_onCheckFinish(AsyncOperationStatus status)
    {
        Debug.Log("finish status is " + status);
        Debug.Log("Path is " + Application.persistentDataPath);
        if (status == AsyncOperationStatus.Succeeded) 
        {
            LoadByName("Prefab3");
            LoadByName("SD");//prefab2
            InstantitateByName("Prefab4");
        }
    }

    private void Res_Completed(AsyncOperationHandle<GameObject> obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            GameObject gob = Instantiate(obj.Result);
            Transform parent = GameObject.Find("Canvas").GetComponent<Transform>();
            gob.transform.SetParent(parent);
        }
    }

    private void LoadByName(string name)
    {
        Addressables.LoadAssetAsync<GameObject>(name).Completed += (handle) => {
            if (handle.Status == AsyncOperationStatus.Succeeded)
            {
                GameObject gob = Instantiate(handle.Result, GameObject.Find("Canvas").GetComponent<Transform>());
                Debug.Log($"加载资源完毕:{gob.name}");
            }else Debug.Log($"加载资源失败:{name}");

        };
    }

    private void InstantitateByName(string name)
    {
        Addressables.InstantiateAsync(name).Completed += (handle) => {
            if (handle.Status == AsyncOperationStatus.Succeeded)
            {
                GameObject gob = handle.Result;
                gob.transform.SetParent(GameObject.Find("Canvas").GetComponent<Transform>());
                gob.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
                Debug.Log("实例化对象创建完毕" + gob.name);
            }else Debug.Log($"加载资源失败:{name}");
        };
    }


}

配置文件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ConfigManager 
{
    public static string CdnUrl = "http://192.168.133.144/Files/dev";
    //public static string RemoteCachePath { get { return Application.persistentDataPath + "/android"; } }
    public static string RemoteCachePath { get {
#if UNITY_EDITOR
            return "AddresableAsset/android";
#else
            return Application.persistentDataPath+"/AddresableAsset"; 
#endif

        }
    }
}

参考工程 https://gitee.com/tygkcsc/addressable-demo/tree/master文章来源地址https://www.toymoban.com/news/detail-472716.html

到了这里,关于Unity之Addressable使用注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity学习笔记--File.ReadAllLines和File.ReadAllText的使用以及注意事项(一定要看到最后!!!)

    最近在做文件存储以及读取的时候,需要用到C#给我们提供的类: File 具体使用方法可以看官方文档:C# File 类 这篇文章只会说 File.ReadAllLines 和 File.ReadAllText 的使用以及注意事项 Tips:(一定要看到最后!!!) 一、File.ReadAllLines 重载 操作 ReadAllLines(String) 打开一个文本文件

    2024年02月02日
    浏览(44)
  • 网桥设置方法及注意的事项

    一、Windows XP网桥配置需要注意的事项 1、配置Windows XP的网桥服务器不要配制成域控制器,只需配置成为独立的服务器即可。 2、安装的两块网卡均要保证工作正常,检验方法为:打开“控制面板→系统”,找到“硬件”选项卡,点击“设备管理器”,展开“网络适配器”,看

    2024年02月06日
    浏览(62)
  • PHP运行的注意事项和基本语法规范

    👨‍💻个人主页 :@开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏 :PHP程序开发 — 通过编写并运行第一个 PHP程序,读者将了解如何开始写 PHP 脚本,并通过 PH函数 echo输出语句,同时还将了解到程序开

    2024年04月11日
    浏览(47)
  • Unity 2D精灵分割图片注意事项

    ** ** 1.导入的图片必须是png格式(其他格式或许可以,但是以现在的水平只能了解到使用png是不出错的) 2.导入图片后,将图片类型改为Sprite(2D and UI),Sprite Mode 改为Multiple,其中Sprite可视情况而定,一般导入的一张图片含有很多要分割的UI就选Multiple,如果只有一个可默认为S

    2024年02月11日
    浏览(41)
  • 网件路由设置COST的注意事项

    在这里,路由域是指一个自治系统,即AS,它是指一组通过统一的路由政策或路由协议互相交换路由信息的网络。在这个AS中,所有的OSPF路由器都维护一个相同的描述这个AS结构的数据库,该数据库中存放的是路由域中相应链路的状态信息,OSPF路由器正是通过这个数据库计算

    2024年02月05日
    浏览(39)
  • 如何设置路由器?路由器设置的方法及注意事项

    如今大多都是一条宽带多人用,所以必须用到路由器。但很多人对路由器设置方法并不是非常懂,也不知道怎么设置,今天就为大家介绍如何如何设置路由器,设置步骤介绍的非常详细,只要大家按图片里的介绍,将PC,电信宽带MODE,路由器,相互正确连接,那么一

    2024年02月06日
    浏览(36)
  • Unity初学注意事项,以及最新如何删除云端项目

    作为一个对好玩的事感兴趣的人 近段时间我开始学习Unity了 首先呢,我们得先了解Unity是用于开发游戏的一个开源软件(当然他的专业版还是要收费的,这里指的个人版,初学者都是够用的,个人版开发的游戏也可以发布,只要游戏所赚的金额不超过100000元都是可以不用换的

    2024年02月07日
    浏览(49)
  • Unity3D开发流程及注意事项

    使用Unity3D开发游戏需要遵循一定的流程和注意事项,以确保项目的顺利进行并获得良好的结果。以下是一般的游戏开发流程以及一些注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 游戏开发流程: 1.概念和计划阶段

    2024年02月09日
    浏览(48)
  • Unity发布抖音小游戏的一些注意事项

    使用 webgl模式 发布抖音小游戏的一些注意事项 1.打包 使用webgl模式打包抖音小游戏,会因为找不到aapt工具导致打包失败 提示: aapt检查失败: sdk/build-tools/版本号。 解决方法:再unity hub里添加Android Build Support  2.黑屏问题 相机的HDR设为off 3.Text字体不见的问题 不能用unity自带的

    2024年02月11日
    浏览(49)
  • Unity | 以附加模式加载场景,实现多场景叠加及注意事项

    Unity 允许多场景叠加,这种叠加包括编辑模式及运行模式 新建两个简单的场景,SampleScene 和 AdditiveScene,设置不同的天空盒及平行光源颜色 SampleScene AdditiveScene 2.1 添加场景 在编辑器中的场景资源右键选择 Open Scene Additive,或者直接拖拽场景资源到层级视图,都可以实现多场景

    2024年01月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包