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
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!