Unity 协程

Unity 协程协程前言调用方式停止方式yiledreturn语句执行时机WaitForSeconds(floatTime)WaitForSecondsRealtime(floattime)WaitForEndOfFrame()WaitForFixedUpdate()WaitUntil(Funcpredicate)WaitWhile(Funcpredicate)实现自定义函数实际开发中使用建议前言协程是unity提供的一个特殊的机制,他的特点就是可以方便的实现流程化的东西。但是就他的效率而言个人感觉并不乐观,

大家好,又见面了,我是你们的朋友全栈君。

前言

协程是unity提供的一个特殊的机制,他的特点就是可以方便的实现流程化的东西。但是就他的效率而言个人感觉并不乐观,个人理解有点像LUA的闭包,C#的goto语句,需要保存大量的数据和大量的逻辑处理,而针对于实际业务来讲我们可能需要的逻辑量并没有那么大,另外协程中如果有比较复杂的逻辑处理,对于扩展和维护还是比较费力的。
当然协程既然这样,还有使用么?当然还是有用的,只不过大家需要根据场景进行使用。因为有些逻辑用协程来还是比较方便的,如果不用的话可能需要手敲一串子代码。

调用方式

被调用函数必须返回IEnumerator。

  1. public Coroutine StartCoroutine(string methodName);
  2. public Coroutine StartCoroutine(string methodName, [DefaultValue(“null”)] object value);
  3. public Coroutine StartCoroutine(IEnumerator routine);
    以上方法均为Monobehavior的内部方法可在MonoBehavior的子类中直接使用,方式1,2通过名称调用,区别在于1只能调用无参函数,2可以调用一个带有参数的函数。3是通过方法直接调用,可以支持任何参数。
    在这里插入图片描述
    由上可以看出,1.对于使用方法名的调用带参数的函数,运行时会报错。
    2 .同一个协程函数可以被多次调用。
    细心的同学可能会有问,如果上例中的函数别重载,使用方法名的方式调用会不会有问题呢?如果你知道结果给你点个赞。我们测试一下。
    在这里插入图片描述
    没错,发现了什么?使用方法名的带参数的调用居然使用没参数的重载方法(unity版本2018.4,使用方法名方式调用协程,不会识别重载,只会调用编译时第一个名称符合的方法),而使用方法体的方法却可以区分开重载。所以使用方法名调用的方式慎用。

由于协程的调用依赖于Mono脚本,在实际开发中我们可以进行其进行一个封装,

停止方式

  1. public void StopAllCoroutines();
  2. public void StopCoroutine(string methodName);
  3. public void StopCoroutine(IEnumerator routine);
  4. public void StopCoroutine(Coroutine routine);

方式1:停止此Mono脚本内的所有协程。
方式2:停止使用方法名启动的此方法的协程函数,如图所示
并没有停止使用调用方式3开启的协程
在这里插入图片描述

方式3:停止对应启动方式3开启的协程,如图
在这里插入图片描述
方式4:停止的开启时的其返回值,可以停止以以上三种方式开启的协程。

yiled return语句执行时机

在这里插入图片描述

WaitForSeconds(float Time)

等待一段时间后继续执行,yiled return 数字,和其效果一致。由上图可以发现,等待时间结束后的执行时机在update后,lateupdate前。

WaitForSecondsRealtime(float time)

与WaitForSeconds不同的是,此方法不受timescale的影响

WaitForEndOfFrame()

等待到当前帧结束。

WaitForFixedUpdate()

等到物理帧结束。

WaitUntil(Func predicate)

直到predicate返回true。predicate执行时机为首次执行为调用时机(比如在Start中开启的协程,则本帧在Start时执行,本帧的Update后则不再执行),之后执行时机为Update之后,LateUpdate之前。如图
在这里插入图片描述

WaitWhile(Func predicate)

与WaitUnitl相似,唯一不同的是predicate返回false结束。

实现自定义函数

继承CustomYieldInstruction。实现keepWaiting即可。例如实现等待指定帧数后执行的自定义函数
在这里插入图片描述

Tips 返回任意类型

如果yiled return 返回的类型是我们的随意定义的一个类型,比如yiled return vecter3.one,则下一帧继续执行后续内容。

实际开发中使用建议

开发中,并不是所有的脚本都继承自mono,相反实际项目中大部分都不会继承自mono,所以我们可以单独拿出来一个继承自Mono的单例类,专门用于开启协程。但是应该禁止使用sting的方式开启和关闭协程,所以我们的单例应该禁止其访问这些方法。大致如下

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Internal;

public class CoroutineManager : MonoBehaviour
{
    public static CoroutineManager Instance { get; private set; }
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
    }
    public new Coroutine StartCoroutine(IEnumerator routine)
    {
        return base.StartCoroutine(routine);
    }
    [Obsolete("无法使用此方法开启协程", true)]
    public new Coroutine StartCoroutine(string methodName)
    {
        return null;
    }
    [Obsolete("无法使用此方法开启协程", true)]
    public new Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
    {
        return null;
    }
    public new void  StopCoroutine(IEnumerator routine)
    {
        base.StopCoroutine(routine);
    }
    public new void StopCoroutine(Coroutine routine)
    {
        base.StopCoroutine(routine);
    }
    [Obsolete("无法使用此方法关闭协程", true)]
    public new void StopCoroutine(string methodName)
    {
        
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147704.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • turtlebot+lms111+gmapping实践

    turtlebot+lms111+gmapping实践1.配置激光按照cartographer的配置来如果已经跑过cartographer无需配置2.计算机文件夹下需修改的地方在桌面上新建文档gmapping.launch.xml文件内容如下…

    2022年6月21日
    20
  • 彻底搞懂Java多态

    彻底搞懂Java多态很多初学者在自学 Java 时候都卡在了 Java 多态 本教程从实际案例出发阐述 Java 多态现象及 Java 多态的原理 通过案例理解多态的现象需求描述多态是类在继承关系下的一种形态 下边先通过一个需求展示下多态的现象 攀博课堂是一个在线教育学习平台 有一个具体的功能需求 当学员登录后系统需要根据学员的类型获取他在攀博课堂的服务权限 比如 对于普通学生他可以自学 Java 课程 下载资源 在线问答交流 对于 Vip 学员还可以额外有专属老师指导 专属交流群等 Vip 服务 如何使用面向对象的编程思想实现这一功能需求

    2025年7月31日
    4
  • Android SDK下载安装及环境配置[通俗易懂]

    Android SDK下载安装及环境配置[通俗易懂]前面两步,我们已经配置了JDK变量环境,并安装好了Eclipse,通过这两步之后Java的开发环境就准备好了,如果我们只是开发普通的JAVA应用程序的话,那么到这里就可以了。但如果我们要通过Eclip

    2022年7月1日
    31
  • Spring Aop底层原理详解(利用spring后置处理器实现AOP)

    Spring Aop底层原理详解(利用spring后置处理器实现AOP)写在前面:对于一个java程序员来说,相信绝大多数都有这样的面试经历,面试官问:你知道什么是aop吗?谈谈你是怎么理解aop的?等等诸如此类关于aop的问题。当然对于一些小白可能会一脸懵逼;对于一些工作一两年的,可能知道,哦!aop就是面向切面变成,打印日志啊,什么什么的,要是有点学习深度的呢可能会说aop底层实现利用了jdk动态代理,cglib啊什么的。很多时候可能面试就到此打住了,当然,然后也…

    2025年12月5日
    2
  • gradle教程_Gradle教程

    gradle教程_Gradle教程gradle教程WelcometoGradleTutorial.Inmyearlierposts,welookedintoWhatisGradleandGradleEclipsePlugin.欢迎使用Gradle教程。在我之前的文章中,我们研究了什么是Gradle和GradleEclipse插件。Gradle教程(GradleTutorial)…

    2022年6月28日
    30
  • 怎么查合适的软件测试外包公司?

    怎么查合适的软件测试外包公司?为什么选择测试外包 1 节约企业开发成本 企业在进行软件研发时 已经投入了大量的人力物力成本进行 如果测试工作仍然由企业自行承担的话 无疑会增加企业在测试上的人力和资源开发成本 而很多测试外包公司已经有现成的资源可以利用 何乐而不为呢 2 提升企业产品质量 通过测试外包进行功能 性能测试 能够帮助企业全面度量产品质量 从而在激烈的软件产品竞争市场上提高竞争力 实现更快速的发展 怎么查合适的软件测试外包公司 如果企业选择加软件测试工作外包给别的机构来做 最关键的一点就是寻找合适的软件测试外包公司了

    2025年10月9日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号