前言
Unity3D中的协程一直是我心目中最好用最优雅的部分,今天就花三分钟时间总结一下协程相关的知识,方便各位初学者快速入门
什么是协程?
在unity3D中,协程可以理解为MonoBehavIoUr中另一个Update函数,但不同的是他可以分帧执行,就是说我们可以在第一帧执行一次,然后在第N帧再执行一次,最终完成整个函数。
怎么用?
一般来说就两步
(1)写一个返回值类型为IEnumerator的函数,相比一般函数,return要替换为yield return xxx。
(2)在该脚本的真正逻辑中调用这个函数。调用方法是StartCoroutine(“方法名”)或者StartCoroutine( 方法名( [参数] ) )。
一段最简的携程代码如下:
void Start ()
{
StartCoroutine(CoroutineFunction());
}
IEnumerator CoroutineFunction()
{
Debug.Log("调用了协程");
yield return null;
}
当然这一段代码是没实际作用的,只是让初学者明白协程的使用方法。下面介绍应用场景时会有更有用的代码。
为什么要用协程?一般应用场景是什么?
根据本人经验,协程的应用场景一般有三
1,定时器。有的代码不需要也不允许每帧执行一次,只需定时执行,这时就可以用协程来实现。
void Start ()
{
StartCoroutine( TimeCounter() );
}
int count = 0;
IEnumerator TimeCounter()
{
while (true)
{
yield return new WaitForSeconds(3);
Debug.Log("第" + ++count + "个三秒");
}
}
2,分帧执行复杂逻辑
有的计算(比如大数的运算、图片模型的处理)一帧计算不完,不能放在update中;但放在start中又会导致程序卡死,这个时候就可以用协程来解决问题。
下面是一段程序实例,每帧只执行100次循环,最终逐步执行完整个代码。
void Start ()
{
StartCoroutine(ComplexCalculater() );
}
IEnumerator ComplexCalculater()
{
for(long i = 0;i < 10000000; i++)
{
if(i % 100 == 0)
yield return null;
Debug.Log(i);
}
}
想让一段逻辑按照你想要的顺序执行
这个例子我想了一会,觉得玩过《和平精英》的读者很容易理解:玩家死之后不能立刻消失,要把自己的装备盒放到地上再默默升天~
这个时候如果用普通的程序逻辑,你要时刻检测是不是把盒子放到地上了,是不是动画播放完了,是不是该归西了。。。很麻烦,而协程只需几句代码就能完成,伪码如下:
void Start ()
{
if(health == 0)
StartCoroutine( Die() );
}
IEnumerator Die()
{
把装备盒放到地上();
yield return null;
挥挥手();
yield return null;
升天();
yield return null;
销毁对象();
yield return null;
}
注意事项
怎么样,协程是不是很方便?但是协程虽好,也不能乱用。每个协程函数至少要执行两帧才能完成,性能肯定略差于普通函数,定时器的话用Invoke、InvokeRepeat也能完成,具体取舍还是要看项目需要哦。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。