版权申明:
- 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
- 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
本系列索引:
引言
- 上图中,游戏主角释放技能,攻击到一个小怪后,小怪死亡播放一个死亡溶解效果(由一段C#脚本控制)。Unity就会在每一帧执行动画控制脚本,同时Unity又需要控制主角打死小怪后下一个动作,比如移动、释放其他技能等。我们可以得知,Unity在游戏运行的每一帧中,都需要同时控制多个程序脚本运行,并且还需要让它们并行执行,那么这样一种在一个程序段中让程序并行执行的过程,我们就叫它协程。
什么是协程
- 既然我们要使用协程,那么首先我们就要了解什么是协程。协程的英文叫做Coroutine,它的概念存在于很多编程语言中,比如游戏开发常用的Lua,Ruby等
- 由于Unity3D是一种单线程的编程语言,所谓的单线程并不是指Unity整个引擎只开了一条线程,而是指Unity整个引擎有多条渲染线程,但是对于调用我们编写的游戏脚本的情况,Unity是统一放在一条主线程进行调度的
- 因此我们可以认为,对于我们写的游戏脚本,Unity是单线程的,所以需要使用一种机制,来模拟多线程的情况,即采用协程的机制。
- 我们需要明确的一点是:协程不是进程,不是线程,它的执行过程更类似于一个子例程
- 以上图代码为例,CountCoroutine函数就是一个协程并由Unity调用
- 作为协程的函数有一个特点,即没有返回值。IEnumerator只是协程的一个固定用法
- 我们通过StartCoroutine来启动这个协程,Unity会在游戏的每一帧中定时调用我们所写的CountCoroutine协程
上面的代码可能对初学者有些抽象,下面我们就打开Unity,通过实际操作进行学习。
协程的用法
-
首先新建一个场景,在项目资源下面右键创建一个C#脚本,这里取名为StudyCoroutine,然后将脚本拖到主摄像机上并打开。
-
将默认的Update函数删除,并写入一个for循环,预期输出0-9。然后启动程序
-
程序一下就执行完循环并输出了我们想要的结果。
-
那么我们怎么才能让程序能够跑一下停一下,每隔一秒输出一个我们想要的数字呢?
-
这里我们就需要用到协程,因为协程有一个并行执行的功能。
-
这里yield会构造一个返回值类型为IEnumerator类型的对象,详细的底层实现今天的课程暂且不谈。
- 接着我们去Unity启动看下效果。
- 当我们按下空格键时,程序输出到7就停止执行了。这就是我们停止协程的第一种方法。
- 我们启动协程的时候也可以用StartCoroutine的方法,并传入一个协程的名字,这里以CountCo为例。那么这样的话,我们在停止的时候就可以用
StopCoroutine("CountCo")
来停止。
-
还有一种方法,是我们利用StartCoroutine的返回值类型,它返回的类型是一个Coroutine类型,也就是一个协程对象。其实Unity在引擎内部存的就是这样一个协程对象。我们将它保存下来,命名为Co
-
Coroutine co
然后定义Co =StartCoroutine("CountCo")
,这样我们在停止的时候 就可以用StopCorotinue(co)
来停止。 -
此外,协程启动时必须用字符串方式启动,才能用字符串方式停止。这是新手小白们常犯的错误。
更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)