using System;
using System.Runtime.CompilerServices;namespace MYTOOL
{public static class AsyncOperationExtensions{public static AsyncOperationAwaiter GetAwaiter(this UnityEngine.AsyncOperation asyncOp){return new AsyncOperationAwaiter(asyncOp);}public struct AsyncOperationAwaiter : INotifyCompletion{private readonly UnityEngine.AsyncOperation m_AsyncOperation;private Action m_Continuation;public AsyncOperationAwaiter(UnityEngine.AsyncOperation asyncOperation){m_AsyncOperation = asyncOperation;m_Continuation = null;}public readonly bool IsCompleted => m_AsyncOperation.isDone;public readonly void GetResult() { }public void OnCompleted(Action continuation){m_Continuation = continuation;if (m_AsyncOperation.isDone){continuation?.Invoke();}else{m_AsyncOperation.completed += OnAsyncOperationCompleted;}}private readonly void OnAsyncOperationCompleted(UnityEngine.AsyncOperation obj){m_AsyncOperation.completed -= OnAsyncOperationCompleted;m_Continuation?.Invoke();}}}
}
测试代码
using MYTOOL;
using MYTOOL.UI;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;public class UILogin : UIBase
{public RawImage rawImage;protected override async void OnCreate(){UnityEngine.Debug.Log("开始加载...");await SceneManager.LoadSceneAsync("Main");UnityEngine.Debug.Log("结束加载...");UnityEngine.Debug.Log("开始加载2...");var rHandle = Resources.LoadAsync<TextAsset>("Test");await rHandle;UnityEngine.Debug.Log("结束加载2...");}private void Start(){Debug.Log("Start");}
}
可以看到异步方法是按照顺序执行的