Skip to main content
ARShow
ARShow
ARShow
 首页 » 资源教程 » Unity3D教程

Unity3d 使用async await异步语法

2016年09月19日 13:03:0026440蛮牛网

u3d大家都知道,官方是不支持6.0的语法的。 其实一些边边角角语法糖也确实不是那么重要,但是有一个功能始终让我耿耿于怀那就是C#的异步语法支持 async await, 这个语法是C# 4.5才出现的, unity自然是不支持的啦. 


没有异步语法的C#,只是一个残次品, 少了一半的战斗力. 

没有异步语法async await, 大家只能勉为其难的用着yield这个残次品, yield这种异步还不能方便取消异步调用

没有异步语法, 一个个回调让整个游戏代码都显得支离破碎难以维护.

好在我找到了这个链接: 

https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration/src

具体怎么用我就不说了,大家自己看,总之我做的是端游, 用了一年多了, 没有出过问题. 有了异步语法的支持, 有很多代码可以改的更加清晰可读,可维护了,举几个例子:

1.可以增加RPC消息了,之前可能大家只能发一个消息,然后再加一个回调消息处理,现在可以变成这样:

[C#] 纯文本查看 复制代码

?

1
2
Debug.Log("发送消息前");
S2C_FetchServerTime s2C_FetchServerTime = await MessageComponen.CallAsync<S2C_FetchServerTime>(new C2S_FetchServerTime());
Debug.Log("收到消息后");

整个收发消息的过程是不是非常顺畅呢? 发送消息前后代码都在一起,维护起来真方便啊

2. 切换场景异步支持, 之前可能大家需要在场景上挂个init之类的脚本, 加载场景后会回调init脚本.这样加载前和加载后就切成了两段, 维护起来真麻烦

[C#] 纯文本查看 复制代码

?

1
2
Debug.Log("切换场景前")
await SceneComponent.ChangeSceneAsync("Lobby");
Debug.Log("切换场景后")

切换场景的前后代码在一起,维护起来是不是非常方便呢?

3. 定时器,比如增加了一个buff,这个buff在过期后自动删除,我们可以写这样的代码:

[C#] 纯文本查看 复制代码

?

1
TimerComponen.WaitTillAsync(buff.Expiration, buff.CancellationTokenSource.Token);
BuffComponent.RemoveBuff(buff);

当然这个buff时间更新了,我们还能取消之前这个异步调用,只需要:

[C#] 纯文本查看 复制代码

?

buff.CancellationTokenSource?.Cancel();

这种取消异步调用的功能也是异步语法中不可缺少的

上面举了几个例子,大家可以看到async await 异步语法的威力,其实将异步回调的形式改成async await也很简单,只需要用一下TaskCompletionSource这个类,

具体我就不细说了,大家自己查文档吧

评论列表暂无评论
发表评论