unity当中协程的使用

221900221_沈建伟 学生 2022-06-26 23:53:57

目录

  • 1.技术概述
  • 2.技术详述
  • 1.协程实现逐字打印的动画效果
  • 2.协程实现过场动画中的进度条滚动
  • 3.遇到的问题以及解决方法
  • 3.总结
  • 4.参考博客

1.技术概述

unity的协程(Coroutine)只是在c#的基础上做了一层封装,其实yield是C#的关键字。
unity协程是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余的部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数。
函数体全部执行完成,协程结束。
由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。

什么情况下使用到该技术:主函数在后台加载,前台可以实现一些小功能,类似过场加载的进度条,以及逐字打印文本内容。

学习该技术的原因:将原来需要用异步实现的代码通过同步的方法实现,类似CPU的分时运行,给协程一定的CPU时间来运行。

2.技术详述

协程的实现需要在Unity中继承MonoBehaviour并使用C#的迭代器IEnumrator,格式如下所示:

IEnumrator 函数名(形参表)  //最多只能有一个形参 
{   
    yield return xxx; //恢复执行条件
    //方法体
}

在IEnumerator类型的方法中写入需要执行的操作,遇到yield后会暂时挂起,等到yield return后的条件满足才继续执行yield语句后面的内容。
开启协程需要使用StartCoroutine()方法。
调用StopCoroutine()方法中止协程执行。
生命周期图:

在这里插入图片描述


图片来源于此篇博客:点此跳转

下面将会用两个我项目中的例子说明协程的使用

1.协程实现逐字打印的动画效果

// 协程逐字打印文本的效果,用协程产生延时的效果
    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;
        }
    }

在此段代码中,通过协程,在每一帧当中逐渐增加文本的内容长度,从而实现逐字打印文本的效果。

2.协程实现过场动画中的进度条滚动

/// <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();
    }

因为协程延时返回,所以可以实现在一定时间内旋转进度条一定的角度,且是匀速进行。

3.遇到的问题以及解决方法

协程的代码量其实不长,协程的难点主要是如何想到要用协程使用。
在项目中,刚开始我想给进度条的滚动添加动画,通过每次调用动画实现滚动的效果,但是动画制作起来繁琐,且无法复用,后来再搜索的时候接触到了协程技术,这才有了用协程实现进度条的滚动效果。
总的来说,当碰到一些需要异步加载的时候,比如后台在进行过场的加载,这时候前台不能什么都不显示,这样子会让用户误以为电脑卡住了,这时候就可以通过协程写点进度条,更有甚者可以写个小游戏,让过场动画不再那么无聊。

3.总结

学好协程,可以拓宽我们的思路,在碰到问题的时候从其他角度思考来解决。

4.参考博客

unity协程

...全文
116 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
2022年福大-软件工程、实践-W班

134

社区成员

2022年福大-软件工程;软件工程实践-W班
社区管理员
  • FZU_SE_teacherW
  • 丝雨_xrc
  • Lyu-
加入社区
帖子事件
创建了帖子
2022-06-26 23:53
社区公告
暂无公告