Unity Addressable 程式筆記


建立時間: 2023年8月30日 14:06
更新時間: 2023年8月30日 19:56

說明

分享一些已知的 Unity Addressable 程式開發技巧,因內容水很深,可能會有資訊錯誤的情況,若有發現錯誤,請通知我修正,謝謝。

比較常見的請參考官方文件

AssetReference

這適合在 Unity Editor 手動拉 Addressable 物件給組件參考的方法。

以下是官方文件範例

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

internal class LoadFromReference : MonoBehaviour
{
    // Assign in Editor
    public AssetReference reference;

    // Start the load operation on start
    void Start()
    {
        AsyncOperationHandle handle = reference.LoadAssetAsync<GameObject>();
        handle.Completed += Handle_Completed;
    }

    // Instantiate the loaded prefab on complete
    private void Handle_Completed(AsyncOperationHandle obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            Instantiate(reference.Asset, transform);
        }
        else
        {
            Debug.LogError("AssetReference failed to load.");
        }
    }

    // Release asset when parent object is destroyed
    private void OnDestroy()
    {
        reference.ReleaseAsset();
    }
}

以下是相關的 reference 可以值得參考。

private AssetReferenceT<TextAsset> referenceT;
private AssetLabelReference labelReference;

偽同步載入

一般你看到 Addressable 都是告訴你非同步下載 Addressable,這裡提供一個類似同步下載的寫法。

internal class LoadFromReference : MonoBehaviour
{
    // Assign in Editor
    public AssetReference reference;

    private async void LoadReference()
    {
        AsyncOperationHandle<GameObject> handle =
            reference.LoadAssetAsync<GameObject>();

        await handle.Task;

        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            // 下載成功
        }
        Addressables.Release(handle);
}

預載

你可以預先下載 Addressable 之後你就可以節省下載時間。

以下是我寫得預載腳本片段。

    /// <summary>
    /// 預載標籤
    /// </summary>
    [SerializeField]
    private AssetLabelReference preloadLabel;

    /// <summary>
    /// 下載完成事件
    /// </summary>
    [SerializeField]
    private UnityEvent<bool> completionEvent;

    /// <summary>
    /// 進度事件
    /// </summary>
    [SerializeField]
    private UnityEvent<float> progressEvent;

    /// <summary>
    /// 預載遊戲數據
    /// </summary>
    /// <returns></returns>
    private IEnumerator PreloadData()
    {
        float progress = 0;

        downloadHandle = Addressables.DownloadDependenciesAsync(preloadLabel, false);

        while (downloadHandle.Status == AsyncOperationStatus.None)
        {
            float percentageComplete = downloadHandle.GetDownloadStatus().Percent;

            // Report at most every 10% or so
            if (percentageComplete > progress * 1.1)
            {
                // More accurate %
                progress = percentageComplete;
                progressEvent.Invoke(progress);
            }

            yield return null;
        }
        progress = 1;
        progressEvent.Invoke(progress);
        completionEvent.Invoke(downloadHandle.Status == AsyncOperationStatus.Succeeded);
        // Release the operation handle
        Addressables.Release(downloadHandle);
    }
觀看次數: 1246
addressableunity
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!