Unity は Addressables を使用して、すべてのリソースをプリロードし、リソースを撤回してロードし、webgl の読み込みが遅い問題を公開します

私も Addressables は初めてで、あまり詳しくはありませんが、基本的な使用法はいくつか知っています。

1. Window->Package Manager で Addressables を見つけてインストールします。

 

2. リソースを選択し、Assets でリソースをクリックすると、Inspector パネルに Assressable のチェックが表示されます。つまり、AssetBundle グループと同じプロパティであるリソース パッケージ グループに参加するかどうかです。選択すると、アドレス指定可能パネルのグループに表示されます。

既定のグループがあり、自分で新しいグループを作成することもできます.グループ内のリソースは、アドレス指定可能を使用してリソースをロードできます.

これは私のグループです window->AssetsManagement->Addressables->Groups をクリックして、このインターフェイスを表示します

リソースをグループにドラッグするか、直接追加します

赤いボックスはリソースのキーであり、次のデフォルトはラベルであり、ラベルに従ってリソースをロードすることもできます

 

(1) パスはグループ内のリソースの名前です. この名前はカスタマイズすることも, 後ろのラベルタグにすることもできます.

 Addressables.LoadAssetAsync<GameObject>(path).Completed += (opt) =>
                    {
                        if (opt.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
                        {
                            GameObject panel1 = Instantiate(opt.Result, m_LayerDic[data.layer]);
                            panel1.transform.localPosition = Vector3.zero;
                            panel1.transform.localScale = Vector3.one;
                        }
                        else
                        {
                            Debug.LogError("load error");
                        }
                        m_IsLoading = false;
                    };

(2) 以下の図に示すように、AssetReference を介してリソースをロードし、チェックされたリソースをスクリプトの AssetReference タイプの下に吊るし、この方法でインスタンス化します。

(3) シーンのロードとアンロード

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

public class SceneLoadManager : TSingleton<SceneLoadManager>
{
    public void UnloadScene()
    {
        Addressables.UnloadSceneAsync(handle);

    }

    public void LoadScene(string sceneName, UnityEngine.SceneManagement.LoadSceneMode mode= UnityEngine.SceneManagement.LoadSceneMode.Additive)
    {
        CoroutineMgr.Instance.StartCorountine(DoLoadScene(sceneName, mode));
    }

    AsyncOperationHandle<SceneInstance> handle;
    IEnumerator DoLoadScene(string sceneName, UnityEngine.SceneManagement.LoadSceneMode mode)
    {
        handle = Addressables.LoadSceneAsync(sceneName, mode);
        while (!handle.IsDone)
        {
            Debug.Log("LoadSceneAsync" + handle.PercentComplete);
            yield return null;
        }
        Debug.Log("LoadSceneAsync complete");
    }
}

 

3. プロファイル: 独自のリソース パッケージのアドレスを設定し、設定した場所を選択して、[プロファイルの管理] を入力します。

• ローカル ビルド パス - ローカル ビルド パス
• ローカル ロード パス - ローカル ロード パス
• リモート ビルド パス - リモート ビルド パス
• リモート ロード パス - リモート ロード パス

4. 再生モード スクリプトには 3 つのオプションがあります。1 つ目は、Unity エディターでテストできる高速読み込み (高速)、2 つ目はシミュレートされた読み込み (高度)、Unity はリモート読み込みプロセスをシミュレートし、3 つ目はビルド読み込み (必要です) です。 )、プログラムがパッケージ化されている場合、最初にそれを選択してリソースをパッケージ化する必要があります

5. パッケージ化する前にリソースをパッケージ化し、[デフォルトのビルド スクリプト] を選択します。  

Update a Previous Build は、 最初のビルド中に生成された bin ファイルを再度選択し、更新された方法でリソース パッケージをビルドすることです。アップデートパッチパックをヒット

最後に、リソースのプリロードについて説明しましょう。これは、Addressables のラベル タグを介してすべてのリソースをロードすることです。

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

public class Main : MonoBehaviour
{
    public GameObject root;
    private AsyncOperationHandle dn;
    // Start is called before the first frame update
    private void Awake()
    {
         if (UIManager.Instance == null)
        {// 切换场景只实例化一次
            GameObject obj = Instantiate<GameObject>(root);
            obj.name = "UIRoot";
            DontDestroyOnLoad(obj);
        }
    }
    void Start()
    {
        PreLoadAllAssets();
    }
    // 预加载所有资源
    void PreLoadAllAssets()
    {
        dn = Addressables.DownloadDependenciesAsync("default", true);
        while (dn.PercentComplete != 1)
        {
            if (UnityCallJs.Instance)
            {
                UnityCallJs.Instance.LoadAssetsPro_Update(dn.PercentComplete.ToString());
            }
            Debug.Log("下载进度" + dn.PercentComplete);
        }
        dn.Completed += (opt) =>
        {// 加载完成
            if (UnityCallJs.Instance)
            {
                UnityCallJs.Instance.LoadAssetsPro_Update("1");
            }
        };
    }
    // Update is called once per frame
    void Update()
    {
    }
}

 このように、デフォルトのタグがすべてのリソースの背後で選択されている限り、それらはすべてロードされ、インターフェイスがロードされたときにすばやくロードして表示できます。

 ここでは、js の読み込みの進行状況、unity と js の間の通信に通知を追加しました。公式 Web サイトの説明WebGL: Interacting with browser scripts - Unity Manualを参照してください。

おすすめ

転載: blog.csdn.net/github_38633141/article/details/123851193
おすすめ