142
社区成员




unity的协程(Coroutine)只是在c#的基础上做了一层封装,其实yield是C#的关键字。
unity协程是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余的部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数。
函数体全部执行完成,协程结束。
由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。
什么情况下使用到该技术:主函数在后台加载,前台可以实现一些小功能,类似过场加载的进度条,以及逐字打印文本内容。
学习该技术的原因:将原来需要用异步实现的代码通过同步的方法实现,类似CPU的分时运行,给协程一定的CPU时间来运行。
协程的实现需要在Unity中继承MonoBehaviour并使用C#的迭代器IEnumrator,格式如下所示:
IEnumrator 函数名(形参表) //最多只能有一个形参
{
yield return xxx; //恢复执行条件
//方法体
}
在IEnumerator类型的方法中写入需要执行的操作,遇到yield后会暂时挂起,等到yield return后的条件满足才继续执行yield语句后面的内容。
开启协程需要使用StartCoroutine()方法。
调用StopCoroutine()方法中止协程执行。
生命周期图:
下面将会用两个我项目中的例子说明协程的使用
// 协程逐字打印文本的效果,用协程产生延时的效果
IEnumerator TypeText(string str,float interval)
{
int i = 0;
while (i <= str.Length)
{
dialogTextUI.text = str.Substring(0, i++); //设置对话框的文本内容
yield return new WaitForSeconds(interval); //协程返回
}
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
StopAllCoroutines();
dialogTextUI.text = allText;
}
}
在此段代码中,通过协程,在每一帧当中逐渐增加文本的内容长度,从而实现逐字打印文本的效果。
/// <summary>
/// 协程实现进度条上的图片的滚动
/// </summary>
IEnumerator RunSlider()
{
int i = 0;
while(i < 250)
{
sliderImage.transform.localEulerAngles = new Vector3(0, 0, sliderImage.transform.rotation.z + 100f);
yield return new WaitForSeconds(0.04f);
}
StopAllCoroutines();
}
因为协程延时返回,所以可以实现在一定时间内旋转进度条一定的角度,且是匀速进行。
协程的代码量其实不长,协程的难点主要是如何想到要用协程使用。
在项目中,刚开始我想给进度条的滚动添加动画,通过每次调用动画实现滚动的效果,但是动画制作起来繁琐,且无法复用,后来再搜索的时候接触到了协程技术,这才有了用协程实现进度条的滚动效果。
总的来说,当碰到一些需要异步加载的时候,比如后台在进行过场的加载,这时候前台不能什么都不显示,这样子会让用户误以为电脑卡住了,这时候就可以通过协程写点进度条,更有甚者可以写个小游戏,让过场动画不再那么无聊。
学好协程,可以拓宽我们的思路,在碰到问题的时候从其他角度思考来解决。