The Addressable Asset System 結合c#製作的語法糖。

本文固定連接,轉載請標明出處

這是一個語法糖。

using System;
using System.Runtime.CompilerServices;
using UnityEngine.ResourceManagement;
using Object = UnityEngine.Object;

public static class IAsyncOperationExtensions
{
    public static AsyncOperationAwaiter GetAwaiter(this IAsyncOperation operation)
    {
        return new AsyncOperationAwaiter(operation);
    }

    public static AsyncOperationAwaiter<T> GetAwaiter<T>(this IAsyncOperation<T> operation) where T : Object
    {
        return new AsyncOperationAwaiter<T>(operation);
    }

    public struct AsyncOperationAwaiter : INotifyCompletion
    {
        private readonly IAsyncOperation _operation;

        public AsyncOperationAwaiter(IAsyncOperation operation)
        {
            _operation = operation;
        }

        public bool IsCompleted => _operation.Status != AsyncOperationStatus.None;

        public void OnCompleted(Action continuation) => _operation.Completed += (op) => continuation?.Invoke();

        public object GetResult() => _operation.Result;
    }

    public struct AsyncOperationAwaiter<T> : INotifyCompletion where T : Object
    {
        private readonly IAsyncOperation<T> _operation;

        public AsyncOperationAwaiter(IAsyncOperation<T> operation)
        {
            _operation = operation;
        }

        public bool IsCompleted => _operation.Status != AsyncOperationStatus.None;

        public void OnCompleted(Action continuation) => _operation.Completed += (op) => continuation?.Invoke();

        public T GetResult() => _operation.Result;
    }
}

使用(一)

using UnityEngine;
using UnityEngine.AddressableAssets;

public class LoadAssetScript : MonoBehaviour
{
    [SerializeField]
    private AssetReference _assetRef;

    private async void Start()
    {
        GameObject instance = await _assetRef.Instantiate<GameObject>();
    }
}

使用(二)

using UnityEngine;
using UnityEngine.AddressableAssets;

public class LoadAssetScript : MonoBehaviour
{
    [SerializeField]
    private string _entryName;

    private async void Start()
    {
        GameObject instance = await Addressables.Instantiate<GameObject>(_entryName);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章