双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

unity当中协程的使用

NoName不秃头 NoName不秃头 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

目录

  • 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协程

...全文

相关推荐

Unity协程(Coroutine)原理深入剖析

NULL 博文链接:https://dsqiu.iteye.com/blog/2029701

weixin_38669628

Unity协程(Coroutine)原理深入剖析再续

NULL 博文链接:https://dsqiu.iteye.com/blog/2049743

weixin_38669628

Unity协程(Coroutine)原理深入剖析.pdf

Unity协程(Coroutine)原理深入剖析.pdf Unity协程(Coroutine)原理深入剖析.pdf Unity协程(Coroutine)原理深入剖析.pdf Unity协程(Coroutine)原理深入剖析.pdf Unity协程(Coroutine)原理深入剖析.pdf

大川君

C#迭代器及Unity协程实例解析

主要介绍了C#迭代器及Unity协程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

weixin_38587509

Unity基础知识——进程、线程、协程入门

前言 我不知道大家在学习这段的时候是什么样的,我在学习协程线程的时候是非常烦躁的。一方面本身就看不懂那种复杂的官方定义,一方面又必须要学明白。在十分不乐意的翻了好多资料后,最后还是回归官方定义的怀抱233333.今天在这我就简单的给大家入个门。 一、基本概念 首先在学习之前,我们要弄懂什么是进程,什么是线程,什么是携程。 简单来说,进程就是你能在任务管理器里看到的内容。包括 这些都是进程。而每一个进程可能还会有一个或多个线程。线程可以简单地理解为一个程序能同时做的不同的事情。比如一个同时收发的服务器等等。 而协程,在Unity中是一个存在于主线程中的东西。在Unity的主线程中的Update

weixin_38672800
评论
收藏 已收藏
分享
返回顶部