找回密码
 立即注册
查看: 564|回复: 0

Unity 中的 async-await 咋用

[复制链接]
发表于 2021-4-19 13:07 | 显示全部楼层 |阅读模式
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


大家可以自行查看,后续会根据这个,写一个新模式的定时器模块 ~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 00:43 , Processed in 0.088124 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表