洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号。

本文是该系列《Unity脚本运行时更新带来了什么?》的第3篇。
洪流学堂公众号回复runtime,获取本系列所有文章。

Unity2017-2018.2中的4.x运行时已经支持到C#6,Unity2018.3将支持到C# 7.2,看看C#的新特性能给代码带来什么吧。

C#5 新特性

  • Asynchronous methods:异步方法
  • Caller info attributes:调用时访问调用者的信息,可以用于调试

Asynchronous methods 异步方法

C#5中引入了两个新关键字async修饰符和await操作符。这是C#5最重要的更新,可以说让异步编程能达到事半功倍的效果。

使用async修饰的方法被称为异步方法,这个方法调用时应该在前面加上await。下面我们来看看这个新特性对Unity中的异步编程有什么影响。

我们先看一下以前使用异步编程,需要使用协程,代码大概是这个样子:

public class AsyncExample : MonoBehaviour
{IEnumerator Start(){Debug.Log("Waiting 1 second...");yield return new WaitForSeconds(1.0f);Debug.Log("Done!");}
}

有了async-await之后,可以这么写:

public class AsyncExample : MonoBehaviour
{async void Start(){Debug.Log("Waiting 1 second...");await Task.Delay(TimeSpan.FromSeconds(1));Debug.Log("Done!");}
}

Unity中的协程是使用迭代器实现的,本质上不是线程,运行时还是在主线程中运行。
但是,对,但是,由于Unity的API只能在主线程中调用,async的方法在调用时会自动开启一个新的线程去执行,所以在Unity中还是有很大的局限。

目前我们可以将不调用Unity API,但是计算量比较大的方法采用异步的方式进行计算。

另外也可以手动去增加Unity中async-await的支持,但是其实有一个Unity插件已经做的很好了,那就是UniRx。例如:

public class AsyncExample : MonoBehaviour
{public Button TestButton;async void Start(){await TestButton.OnClickAsObservable();Debug.Log("Clicked Button!");}
}

关于UniRx这个插件,我们之前在洪流学堂公众号中也已经写过图文版的教程,大家可以在洪流学堂公众号中回复unirx获取。

async-await在Unity中的最佳实践

  • 不要在异步方法中调用Unity的API,就跟不要在子线程中调用Unity的API一样,否则Console中也会报错
  • 异步方法命名应该以Async结尾,这样大家知道调用的时候使用await

Caller info attributes:调用时访问调用者的信息

该功能主要是通过3个Attribute实现:

  • CallerFilePathAttribute 调用方的源码路径(编译时的路径)
  • CallerLineNumberAttribute 调用时的代码行
  • CallerMemberNameAttribute 调用方法或属性的名称

该功能主要是用于调试,示例代码如下:

void Start()
{MethodA();MethodB();
}void MethodA()
{//InsertLog("MethodA");MethodB();
}void MethodB(
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{InsertLog(memberName);Debug.Log(sourceFilePath+sourceLineNumber);
}void InsertLog(string methodName)
{Debug.Log(string.Format("{0} called method B at {1}", methodName,DateTime.Now));
}

小结

本文讲解了C#5的新特性中对Unity变成有影响的新特性。其中有些概念有些难理解,可以再深入地找一些例子进行强化理解。

洪流学堂公众号回复runtime,获取本系列所有文章。

把今天的内容分享给其他Unity开发者朋友,或许你能帮到他。



《郑洪智的Unity2018课》,倾尽我8年的开发经验,结合最新的Unity2018,带你从入门到精通。

[Unity脚本运行时更新]C#5新特性相关推荐

  1. [Unity脚本运行时更新]C#7新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第5篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  2. [Unity脚本运行时更新]C#6新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第4篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  3. [Unity脚本运行时更新]C#4新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第2篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  4. [Unity脚本运行时更新]C#7.3新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第8篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  5. [Unity脚本运行时更新]C#7.2新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第7篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  6. [Unity脚本运行时更新]C#7.1新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第6篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  7. Unity脚本运行时更新带来了什么?

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第一篇,后续会结合Unity实例介绍C# 4 - C# 6都带来了具体哪些变化 ...

  8. Unity项目运行时动态更新光照贴图 | LightMap

    Unity项目运行时动态更新烘培的光照贴图 动态更新烘培的光照贴图 场景的物件没有发生变化(也就是说没有运行时加载在场景上的Prefab) 场景的烘培贴图已经更新,但是有些物件prefab想运行时加载 ...

  9. Unity Timeline运行时脚本控制Mute和UnMute(Mute/UnMute a timeline track via scripting)

    Unity Timeline运行时脚本控制Mute和UnMute 最近遇到了一个问题就是希望能够在运行时脚本控制Timeline特定轨道的mute和unmute,本来以为是一个很简单的问题,结果发现并 ...

最新文章

  1. 全站仪和手机连接软件_全站仪USB口数据线驱动-USB全站仪器数据线驱动程序下载免费版-西西软件下载...
  2. 动态规划-重叠区间2020.3.30
  3. 手游特效太多怎么办?这里有一份性能优化方案可参考
  4. 2021年春季学期期末统一考试 金融统计分析 试题(开卷)
  5. 【转】滚动条消息(WM_VSCROLL和WM_HSCROLL)
  6. 题目1335:闯迷宫( BFS在求解最短路径或者最短步数上有很多的应用)
  7. P2240 【深基12.例1】部分背包问题
  8. This is the default error page for nginx that is distributed with EPEL.
  9. abcde依次进入一个队列_数据结构与算法 | 一文掌握队列Queue(真题讲解)
  10. firefox关闭窗口问题
  11. [转]使用SCOM 2012监控网络
  12. 集成电路总设计(Ⅴ)
  13. 地图上制作线路的动画_航线地图上的动画飞行效果怎么实现?只要五步轻松上手...
  14. 思科模拟器连通服务器网页,思科模拟器主机访问服务器
  15. 烦人的 1KB 1KB文件夹快捷方式病毒专杀
  16. WISP、Client+AP和WDS 区别
  17. 乔纳森 刘易斯 oracle,阿泰刘易斯都是幻想 专家点火箭引援之真命天子
  18. 《那些年啊,那些事——一个程序员的奋斗史》——123
  19. C语言 计算cosx的近似值
  20. 双屏幕 php,电脑双屏互不干扰

热门文章

  1. mysql什么是覆盖索引,MySQL中的覆盖索引
  2. 如何通过ssh登录linux,如何用SSH登录linux?
  3. php 后期发展,php – 通过后期处理上传进度
  4. php 跟踪邮件,php – 电子邮件跟踪 – GMail
  5. 设计师值得学习的分类网站
  6. 插画素材 | 冬天很冷,看到它内心就暖了!
  7. mysql2008优化_SQL server 2008 数据库优化常用脚本
  8. linux发挥不出显卡性能,Ubuntu 9.04 显卡性能不佳问题的解决
  9. Quagga:开源的基于Zebra实现了RIP, OSPF, BGP的动态路由软件
  10. NETCONF YANG语言文件语法格式