美文网首页
Addresble的实际应用

Addresble的实际应用

作者: SeanLink | 来源:发表于2023-07-24 11:01 被阅读0次

    由于项目工程中实际使用的其他下载方式下载,所以配置为本地编译本地加载


    image.png

    如需配置从云端加载也可以在hosting里面配置模拟


    image.png

    第一步: 调试好各个场景以及参数

    然后将场景以及自动生成的一些灯光信息添加至group里面


    image.png

    第二步: 进行编译

    image.png

    至此资源文件基本准备完毕,开始coding过程

    第三步: 当需要加载场景时下载资源包

    using UnityEngine.SceneManagement;
    using UnityEngine.AddressableAssets;
    using UnityEngine.ResourceManagement.AsyncOperations;
    
    private AsyncOperationHandle m_SceneHandle;
    private AsyncOperation asyncOperation;
    
    
    private void shuimohei()
    {
        curretnTheme = "shuimohei";
        m_SceneHandle = Addressables.DownloadDependenciesAsync(curretnTheme);
        m_SceneHandle.Completed += OnSceneLoaded;
    
    }
    
    private void OnSceneLoaded(AsyncOperationHandle obj)
    {
        // We show the UI button once the scene is successfully downloaded      
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            Debug.Log("download Succeeded");
        }
        else
        {
            Debug.Log("download Fail");
        }
    }
    
    

    第四步: 加载下载完毕的场景

    private void startLoad()
    {
        Addressables.LoadSceneAsync(curretnTheme, UnityEngine.SceneManagement.LoadSceneMode.Single, true);
        DynamicGI.UpdateEnvironment();
    }
    

    五、其他(如果是加载其他图片或者预制体资源)

    //address为资源所在的目录
    //比如下面这个cube的目录就为 Assets/Prefabs/Cube.prefab
    
    Addressables.LoadAssetAsync<GameObject>(address).Completed +=
        (op) =>
    {
        if (op.Status == AsyncOperationStatus.Succeeded)
        {
            Debug.Log("load gameobj Succeeded");
            Debug.Log(op.Result as GameObject);
            var go = Instantiate(op.Result as GameObject, Vector3.zero, Quaternion.identity, transform);
            go.transform.localPosition = Vector3.zero;
        }
        else
        {
            Debug.Log("load gameobj error");
        }
    
    };
    
    image.png

    更改资源的加载路径

    image.png

    添加自定义目录

    image.png

    注意: Native 需要配置以/mnt 开头的绝对路径

    例如 : /app/data

    资源加载:

    //使用LoadAssetAsync方法来加载单个资源,通常会用地址作为key。
    using System.Collections;
    using UnityEngine;
    using UnityEngine.AddressableAssets;
    using UnityEngine.ResourceManagement.AsyncOperations;
    
    internal class LoadAddress : MonoBehaviour
    {
        public string key;
        AsyncOperationHandle<GameObject> opHandle;
    
        public IEnumerator Start() {
            //普通加载资源
            opHandle = Addressables.LoadAssetAsync<GameObject>(key);
            yield return opHandle;
        
            if (opHandle.Status == AsyncOperationStatus.Succeeded) {
                GameObject obj = opHandle.Result;
                Instantiate(obj, transform);
            }
        }
        
        void OnDestroy() {
            Addressables.Release(opHandle);
        }
    }
    
    
    

    加载多个资源

    使用LoadAssetsAsync这个方法可以一次性加载多个资源,这个方法除了传Keys以外,还可以传merge mode来如何去组合每个key的结果
    • Union:包含所有匹配的资源
    • Intersection:只包含同时满足所有keys的资源
    • UseFirst:只包含第一个key的
    public List<string> keys = new List<string>() { "characters", "animals" };
    
    AsyncOperationHandle<IList<GameObject>> loadHandle = Addressables.LoadAssetsAsync<GameObject>(
        keys,
        addressable => {
            //Gets called for every loaded asset
            Instantiate<GameObject>(addressable,
                                new Vector3(x++ * 2.0f, 0, z * 2.0f),
                                Quaternion.identity,
                                transform);
    
            if (x > 9) {
            x = 0;
            z++;
        }
        }, Addressables.MergeMode.Union, // How to combine multiple labels 
        false); // Whether to fail and release if any asset fails to load
    
    

    Scenes

    由于引擎限制,在用Addressables.LoadSceneAsync加载场景的时候,是不能用Addressables.LoadSceneAsync的WaitForCompletion来获取结果的,这是因为这个会等到所有依赖加载完成,但是场景的激活必须是异步的。
    但是可以通过sceneHandle的来实现。如下

    IEnumerator LoadScene(string myScene)
    {
        var sceneHandle = Addressables.LoadSceneAsync(myScene, LoadSceneMode.Additive);
        SceneInstance sceneInstance = sceneHandle.WaitForCompletion();
        yield return sceneInstance.ActivateAsync();
    
        //Do work... the scene is now complete and integrated
    }
    

    Note:
    场景的卸载不能用同步的方式。在卸载的时候调用WaitForCompleted会导致资源和场景都没有卸载。
    另外,由于Single模式下,SceneManager会在下个场景加载前先调用UnloadUnusedAssets但是 第二个场景的加载调用WaitForCompletion 又会阻塞主线程,就会造成死锁。

    Catalog的生成

    image.png

    注意路径
    shaderMD5的修改


    image.png image.png

    PS一些配置的解释

    https://zhuanlan.zhihu.com/p/499172933

    相关文章

      网友评论

          本文标题:Addresble的实际应用

          本文链接:https://www.haomeiwen.com/subject/oygqpdtx.html