Unity 中的 async-await 咋用
async-await 是啥?之前在Unity写一个定时功能,可以使用协程实现:
IEnumerator Start(){ Debug.Log("等待 1 秒"); yield return new WaitForSeconds(1.0f); Debug.Log("结束");}
现在会有一种新的实现方式:就是 async-await
async void Start(){ Debug.Log("等待 1 秒"); await Task.Delay(TimeSpan.FromSeconds(1f)); Debug.Log("结束");}
那么这种语法究竟是什么呢?
自从C#5.0,语法糖大家庭又加入了两位新成员: async和await,也就是异步编程语法糖
有什么好处呢?
之前是怎么编程的呢?都是通过给异步请求传递一个回调函数,回调函数再对相应的处理
这样做的问题就是:发起请求的时候对返回值一无所知,十分别扭
但是现在 async-await 让异步请求成为了线性流程
举个例子:
如果想读取SteamingAssets下面的文件,之前都是用 协程+UnityWebRequest
现在可以用
void Start() { ReadText(); } async void ReadText() { Task<string> task = AsyncLoadText("test.txt"); await task; Debug.Log(task.Result); } async Task<string> AsyncLoadText(string url) { string path = Path.Combine(Application.streamingAssetsPath, url); UnityWebRequest getRequest = UnityWebRequest.Get(path); await getRequest.SendWebRequest(); string text = getRequest.downloadHandler.text; return text; }
注意:await getRequest.SendWebRequest(); 这句话。
await 后面需要接的类型是 TaskAwaiter(INotifyCompletion),U3D最开始还没有这个语法,所以很多需要我们自己写扩展类,强行转成 TaskAwaiter 类型,让它支持这个语法。
public static class AsyncOperationExtensions{ public static TaskAwaiter GetAwaiter(this AsyncOperation asyncOperation) { var tcs = new TaskCompletionSource<object>(); asyncOperation.completed += obj => { tcs.SetResult(null); }; return ((Task)tcs.Task).GetAwaiter(); }}
有一个开源的项目:Unity3dAsyncAwaitUtil/releases
这里面封装了很多原来协程支持的类型,基本上可以做到无缝切换
大体模块如下:
image
大家可以自行查看,后续会根据这个,写一个新模式的定时器模块 ~~
页:
[1]