简易协程工具【Wait! - Easy Coroutines】

news2024/11/18 19:57:32

Wait! - Easy Coroutines | Utilities Tools | Unity Asset StoreUse the Wait! - Easy Coroutines from Iterant Games on your next project. Find this utility tool & more on the Unity Asset Store.https://prf.hn/l/b3AQw5a

1、概述

Wait - Easy Coroutines!是一个Unity协程助手,它允许您使用声明性语法编写协程,而不需要IEnumerator或yield语法来完成简单的定时任务。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.Seconds(10,() => {Debug.Log("Waited 10 seconds");}).Start();
    }
}

2、特性

  • 等待Frames、Seconds、SecondsByFrame,或者直到满足指定的条件。
  • 重复你的等待多次或无限期。
  • 容易锁在一起等待。(如。等待一个条件完成后5秒)
  • 组等待一起停止、暂停或恢复它们。
  • 指定在启动等待时运行的操作。
  • 在任何脚本中运行协程,而不仅仅是MonoBehaviors

3、安装

它是免费的!所以只要从Unity Asset Store中抓取它并添加“using SL.Wait;”到任何脚本。

4、依赖

 插件依赖:More Effective Coroutines [FREE]

5、介绍

wait.Start():这个方法需要被调用来开始等待。如果不调用它,那么什么也不会发生。它通常用作Wait设置结束时的链式函数调用。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.Seconds(10,() => {Debug.Log("Waited 10 seconds");}).Start();
    }
}

wait.Start() - delayed:您可以保存Wait对象并在以后启动它,而不需要立即启动它。这对于链式或分组等待特别方便。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = Wait.Seconds(10, () => { Debug.Log("Waited 10 seconds"); });
        timing.Start();
    }
}

wait.Stop():您可以通过在实例上调用stop来提前停止等待。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = Wait.Seconds(10, () => { Debug.Log("Waited 10 seconds"); });
        timing.Start();
        timing.Stop();
    }
}

wait.Pause():您可以通过在实例上调用pause来暂停运行中的等待。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = Wait.Seconds(10, () => { Debug.Log("Waited 10 seconds"); });
        timing.Start();
        timing.Pause();
    }
}

wait.Resume():您可以通过在实例上调用resume来恢复检查等待。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = Wait.Seconds(10, () => { Debug.Log("Waited 10 seconds"); });
        timing.Start();
        timing.Pause();
        timing.Resume();
    }
}

静态构造函数【Static Constructors】:有四个静态构造函数可以帮助清理语法。它们的功能与实例构造函数相同,只是看起来更好。下面是等效的实例语法。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing01 = Wait.Frames(10, () => { Debug.Log("timing01"); });
        //使用Unity Time,当游戏暂停时暂停执行。
        Wait timing02 = Wait.Seconds(10, () => { Debug.Log("timing02"); });
        //Unity Time暂停也运行。
        Wait timing03 = Wait.SecondsWhilePaused(10, () => { Debug.Log("timing03"); });
        Wait timing04 = Wait.For(() => { return true; }, () => { Debug.Log("timing04"); });

        timing01.Start();
        timing02.Start();
        timing03.Start();
        timing04.Start();
    }
}

实例【Instances】:

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing01 = new Wait().ForFrames(10).Then(() => { Debug.Log("timing01"); });
        Wait timing02 = new Wait().ForSeconds(10).Then(() => { Debug.Log("timing02"); });
        Wait timing03 = new Wait().ForSecondsByFrame(10).Then(() => { Debug.Log("timing03"); });
        Wait timing04 = new Wait().Until(() => { return true; }).Then(() => { Debug.Log("timing04"); });

        timing01.Start();
        timing02.Start();
        timing03.Start();
        timing04.Start();
    }
}

链式等待【Chained Waits】,但是不建议这么干:该语法允许您链接多个等待类型,但它将只使用指定的最后一个。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        // ForSeconds()将覆盖等待类型,而不是使用Frames。
        // Then()将覆盖构造函数。
        Wait timing = Wait.Frames(300, () => 
        {
            Debug.Log("这不会运行,它已被下一个Then()调用覆盖。");
        }).ForSeconds(10).Then(() => 
        {
            Debug.Log("等待10秒,而不是300帧。");
        });
        timing.Start();
    }
}

Wait.Frames():在执行函数之前等待指定的帧数。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.Frames(300, () =>
        {
            Debug.Log("Waited 300 frames");
        }).Start();
        Wait.Frames(300).Then(() =>
         {
            Debug.Log("Waited 300 frames");
         }).Start();
    }
}

Wait.Seconds():在执行函数之前等待指定的秒数。使用内部计时方法,当游戏暂停时停止。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.Seconds(10, () =>
        {
            Debug.Log("Waited 10 Seconds");
        }).Start();
        Wait.Seconds(10).Then(() =>
         {
            Debug.Log("Waited 10 Seconds");
         }).Start();
    }
}

Wait.SecondsWhilePaused():在执行函数之前等待指定的秒数。这将检查每一帧是否经过时间,所以即使游戏暂停,它也会运行。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.SecondsWhilePaused(10,
     () => {
         Debug.Log("Waited 10 seconds");
     }).Start();
        Wait.SecondsWhilePaused(10).Then(
    () => {
        Debug.Log("Waited 10 seconds");
    }).Start();
    }
}

Wait.For():在运行给定函数之前,等待给定条件得到满足。这将检查条件每帧,这取决于你保持检查的合理性和性能。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.For(() => { return true; }, () => { Debug.Log("等待直到条件返回true"); }).Start();
        Wait.For(() => { return true; }).Then(() => { Debug.Log("等待直到条件返回true"); }).Start();
    }
}

wait.Until():向任何等待添加条件的实例版本。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = new Wait().Until(() =>
        {
            return true;
        }).Then(() =>
        {
            Debug.Log("等待直到条件返回true");
        }).Start();
    }
}

wait.Repeat():重复等待指定次数。如果输入0,它将无限重复。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait.Seconds(2,
     () =>
     {
         // 这将输出5次,每2秒。
         Debug.Log("Waited 2 seconds");
     }
    ).Repeat(5).Start();
    }
}

Repeat Indefinitely:重复下去,将0传递给Repeat()将无限重复。您可以在某个时候调用timing.Stop(),无论是在等待函数中还是在其他任何地方。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = Wait.Seconds(2);
        timing.Then(() =>
        {
            //if (true)
            //{
            //    timing.Stop();
            //}
            // This will output every 2 seconds until .Stop() is called.
            Debug.Log("Waited 2 seconds");
        });
        // Repeat indefinitely
        timing.Repeat(0);
        timing.Start();
    }
}

wait.Chain():链式,在当前对象完成后运行第二个Wait对象。与其他方法不同,您可以在同一个Wait对象上任意多次调用。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait next_wait = Wait.Frames(600, () => { Debug.Log("等待3秒后等待600帧"); });
        Wait chain_wait = Wait.Seconds(3, () => { Debug.Log("等待3秒,链接到next_wait"); }).Chain(next_wait).Start();
    }
}

Chain Sequence:链序列,按顺序运行多个Wait对象。与其他方法不同,您可以在同一个Wait对象上任意多次调用. chain(),而无需重写。链式等待将按照您使用. chain()添加它们的顺序依次运行。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing_1 = Wait.Frames(600, () => 
        { Debug.Log("等待3秒,然后600帧-链接到next_wait"); });
        Wait timing_2 = Wait.Seconds(5, () => 
        { Debug.Log("等了3秒,然后是600帧,然后是5秒."); });
        Wait chain_wait = Wait.Seconds(3, () => 
        { Debug.Log("等待了3秒-链接到next_wait"); }).Chain(timing_1).Chain(timing_2).Start();
    }
}

Chain Function:链式函数,这将在. then()函数完成之后,与. then()函数在同一帧中运行链接函数。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait chain_wait = Wait.Seconds(3,
            () => { Debug.Log("Waited 3 seconds, chaining to next_wait"); }).Chain(
            () => { Debug.Log("Runs after the main Wait function."); }).Start();
    }
}

wait.Tag():默认情况下,Wait对象使用随机标识。您可以更改标记,以便您可以通过WaitManager引用它,而不需要保存实例。只有公开的等待才能在WaitManager中访问。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    string tagName = "myTiming";
    private void Start()
    {
        Wait.For(() => { return true; },
            () => { Debug.Log("***"); }).Tag(tagName).Start();
        // 在不传递实例的情况下从任何地方停止。
        WaitManager.StopTag(tagName);
    }
}

wait.Group():默认情况下,Wait对象不在任何组中。您可以通过传入任何字符串将其添加到组中。然后,您可以通过WaitManager同时停止、暂停和恢复所有分组对象。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        string groupName = "characterGroup";
        Wait.For(
         () => { return true; },
        () => { Debug.Log("***"); }
        ).Group(groupName).Start();
        Wait.Seconds(10,
         () => { Debug.Log("***"); }
        ).Group(groupName).Start();
        // 在不传递实例的情况下从任何地方停止。
        WaitManager.StopGroup(groupName);
    }
}

Wait Manager:等待管理器是一个静态类,它允许您更容易地访问当前等待的wait对象。您可以通过标记,分组或抓取每一个来停止,暂停或恢复它们来访问它们。

WaitManager.Stop():Stop all active Wait coroutine.

WaitManager.Pause() :Pause all active Wait coroutines.

WaitManager.Resume() :Resume all active Wait coroutines.

WaitManager.StopTag(): Stop the Wait coroutine with the specified tag.

WaitManager.PauseTag() :Pause the Wait coroutine with the specified tag.

WaitManager.ResumeTag():Resume the Wait coroutine with the specified tag.

WaitManager.StopGroup():Stop all active Wait coroutines in the given group.

WaitManager.PauseGroup(): Pause all active Wait coroutines in the given group.

WaitManager.ResumeGroup(): Resume all active Wait coroutines in the given group.

wait.OnStart():每当. start()被调用时运行指定的函数。这对于在一个地方定义并从其他地方开始的Wait对象非常有用。

using UnityEngine;
using SL.Wait;

public class Test : MonoBehaviour
{
    private void Start()
    {
        Wait timing = Wait.Seconds(2, () =>
        {
            // 这将输出5次,每2秒。
            Debug.Log("Waited 2 seconds");
        }
        ).OnStart(() =>
        {
            // 这只会在调用Start()时输出一次。
            Debug.Log("Coroutine Started!");
        }).Repeat(5);
        // 别的地方
        timing.Start();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:建立Python文件的完整指南

建立Python文件的完整指南 如果您正在寻找一个易于学习和使用的编程语言,Python就是一个不错的选择。Python的第一印象常常让人感到吃惊,因为它的代码与许多编程语言相比要短得多,然而它的功能非常强大且使用范围广泛。在本文中,…

【位图布隆过滤器海量数据面试题】

文章目录 1 位图2 布隆过滤器 1 位图 首先我们来看看一个腾讯的面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 分析: 40亿个不重复整形数据,大概有160亿字节…

Linux---vim的使用

专栏:Linux 个人主页:HaiFan. 本章为大家带来Linux工具—vim Linux工具 关于rzszyumvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集简单vim配置配置文件的位置常用配置选项 关于rzsz 这个工具用于windows机器和Linux机器通过Xshell传输…

字符串--字符指针、字符串的访问和输入/输出(字符串空格问题,输入带双引号的字符串)

一、字符指针 字符指针(Character Pointers)是指向字符型数据的指针变量。 每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符…

安卓主板/开发板定制开发生产,MTK/高通/紫光展锐安卓开发板

智物通讯是一家致力于行业安卓主板定制开发的公司,提供包括MTK四核/八核方案、MTK、高通、紫光展锐系列行业主板方案定制等多样化的服务。 用户可以根据实际需求选择各种不同的模块类型,包括4G模块和5G模块。其中4G模块方案有MT6761、MT6762、MT6765、M…

爬虫 python 正则匹配 保存网页图片

目录 1. 简介1.1 爬虫1.2 爬虫语言1.3 python库1.4 我的步骤 2. 导入包2.1 代码2.2 requests库 3. 写入文件函数4. 获取图片5. 主函数5.1 代码5.2 说明一下webbrowser 6. 所有代码7. 其他(可以忽略)8. 总结 在这里我只提供的是一种方法,有很多…

webpack生产模式配置

一、生产模式和开发模式介绍 生成模式(production mode)是指在开发完成后将代码部署到生产环境中运行的模式,通常需要进行代码压缩、优化、合并,以减少文件大小和请求次数,提高页面加载速度和运行效率。 开发模式&am…

Android12 系统开发记录-迅为RK3588使用ADB工具

ADB 英文名叫 Android debug bridge ,是 Android SDK 里面的一个工具,用这个工具可以 操作管理 Android 模拟器或者真实的 Android 设备,主要的功能如下所示:  在 Android 设备上运行 shell 终端,用命令行操作 …

How to fix the NHS 如何改革英国的国民医疗保险制度 | 经济学人20230527版社论双语精翻

他山之石:2023年5月27日《经济学人》社论(Leaders)精选:《如何改革英国的国民医疗保险制度》(“How to fix the NHS”) Leaders | The sick factor 社论 | 致病因素 How to fix the NHS 如何改革英国的国民…

软件安装mysql

1系统约定 安装文件下载目录:/data/softwareMysql目录安装位置:/usr/local/mysql数据库保存位置:/data/mysql日志保存位置:/data/log/mysql 2下载mysql 在官网:MySQL :: Download MySQL Community Server 中&#x…

Guitar Pro8.0.1最新中文版本吉他谱下载及使用教程

许多人都对吉他这个乐器很感兴趣,因为吉他的学习成本较低,学习难度较小,即便是零基础的小白通过短期的学习也能掌握基本的技巧。但实际上,学习吉他还需要认识吉他谱,识谱是每个吉他爱好者都必须掌握的技能,…

数字孪生世界建设核心能力:物理世界感知能力

中国信通院在《数字孪生城市白皮书(2022年)》中指出,数字孪生城市技术集成性高,核心板块日渐清晰,当前已逐步深入到城市全要素表达、业务预警预测、场景仿真推演、态势感知只能决策等多个环节。数字孪生技术的向前发展…

Yum update和upgrade的区别

Yum update和upgrade的区别 Linux yum中package升级命令有两个分别是 yum upgrade 和 yum update 1、区别 默认情况下,yum update和yum upgrade的功能是完全一样的,都是将需要更新的package(这里的包包括常规的包、软件、系统版本、系统内核)更新至软件…

如何使用ArcGIS加载历史影像

历史影像对研究地物的变化可以产生很直观的效果,Esri提供了在线浏览的历史影像,这里给大家介绍一下如何将这个历史影像加载到ArcGIS,希望能对你有所帮助。 获取地图链接 打开地图网站(https://livingatlas.arcgis.com/wayback/&a…

【MySQL】复合查询(重点)

🏠 大家好,我是 兔7 ,一位努力学习C的博主~💬 🍑 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🚀 如有不懂,可以随时向我提问&…

实验篇(7.2) 13. 创建点对点安全隧道 (二)(FortiGate-IPsec) ❀ 远程访问

【简介】上一篇实验发现,两端都是可以远程的公网IP的话,两端防火墙都可以发出连接请求,并且都能够连通。这样的好处是安全隧道不用随时在线,只在有需求时才由发起方进行连接。但是现实中很多情况下只有一端公网IP可以远程&#xf…

番外篇 离线服务器环境配置与安装

(离线远程服务器的Anaconda安装与卸载torch的安装与卸载) 我参考或百度一些博主发的经验贴关于Anaconda的安装与卸载等教程,但实际情况是每一个服务器遇到的问题多多少少总有不一样的地方,虽然可以借鉴,但不能完全照搬…

常见Visual Studio Code 快捷键

一,文件与窗口快捷键: 1.打开一个新窗口: CtrlShiftN 2.关闭窗口: CtrlShiftW 3.文件切换:CtrlTab 4.快速打开文件:CtrlP 5.新建文件: CtrlN 6.切换侧边栏:CtrlB 7.选中单个文…

JWT代码实现

什么是 JWT? JSON Web Token,通过数字签名的方式,以 JSON 对象为载体,在不同的服务终端之间安全的传输信 息。(将信息进行封装,以 JSON 的形式传递) JWT 有什么用? JWT 最常见的场景就是授权认证,一旦用户…

web3.0 爆红是炒作还是真有赚头?

前言 最近两年虽然疫情肆虐全球,虽然困得住人们的脚步,但是困不住科技的发展趋势,前有元宇宙,后有 web3.0,新的热点一个接着一个的出现,技术革新也是越来越快,之前只能在科幻电影、科幻小说中出…