Unity开发——如何在协程中进行回调

news/2024/11/8 0:41:28/

在Unity开发中,协程是一种实用的异步编程方法,要在协程中进行回调,可以使用委托(delegate)、Action或UnityAction


一、委托(delegate)

下面是一个使用协程和回调的简单示例:

    // 声明一个委托类型的回调public delegate void CoroutineCallback();// 在开始时调用void Start(){StartCoroutine(WaitAndExecute(3f, () =>{Debug.Log("延时3秒后执行回调");}));}// 协程方法private IEnumerator WaitAndExecute(float delay, CoroutineCallback callback){// 等待指定的时间yield return new WaitForSeconds(delay);// 执行回调函数callback?.Invoke();}

这个示例中,创建了一个名为WaitAndExecute的协程方法,它接受一个float类型的参数delay和一个名为CoroutineCallback的委托类型的回调函数。在协程方法中,使用了yield return new WaitForSeconds(delay)暂停执行指定的时间,然后调用回调函数。

在Start方法中,我们启动了这个协程,并传递了一个匿名方法作为回调函数。当协程在等待时间结束后,回调函数会被执行,此时将打印一条消息。


为了更具体说明回调函数的使用,下面举个例子演示如何在Unity中使用上述的CoroutineCallback回调函数

假设我们有一个游戏中的任务,需要玩家等待5秒钟,然后显示一个任务完成的提示

using System.Collections;
using UnityEngine;public class TaskExample : MonoBehaviour
{// 声明一个委托类型的回调public delegate void CoroutineCallback();// 在开始时调用private void Start(){// 启动协程,等待5秒钟后执行任务完成的回调函数StartCoroutine(WaitAndExecute(5f, TaskCompleted));}// 协程方法private IEnumerator WaitAndExecute(float delay, CoroutineCallback callback){// 等待指定的时间yield return new WaitForSeconds(delay);// 执行回调函数callback?.Invoke();}// 任务完成的回调函数private void TaskCompleted(){Debug.Log("任务已完成!");// 在这里执行其他任务完成后的操作}
}

在这个示例中,创建了一个名为TaskExample的类,其中包含一个协程方法WaitAndExecute,用于等待指定的时间(由delay参数决定)然后执行CoroutineCallback类型的回调函数。

Start方法中启动了WaitAndExecute协程,并传递了5秒的等待时间和一个名为TaskCompleted的回调函数。当协程等待5秒后,它将执行TaskCompleted回调函数。这个回调函数打印了一条消息,表示任务已完成。你可以在这个回调函数中根据需求添加其他功能。


二、Action或UnityAction

Action实际上是一个C#内置的委托类型,UnityAction是Unity引擎中特定的委托类型。我们同样使用上面提到的例子来说明

using System;
using System.Collections;
using UnityEngine;public class TaskExampleWithAction : MonoBehaviour
{// 在开始时调用private void Start(){// 启动协程,等待5秒钟后执行任务完成的回调函数StartCoroutine(WaitAndExecute(5f, TaskCompleted));}// 协程方法private IEnumerator WaitAndExecute(float delay, Action callback){// 等待指定的时间yield return new WaitForSeconds(delay);// 执行回调函数callback?.Invoke();}// 任务完成的回调函数private void TaskCompleted(){Debug.Log("任务已完成!");//在这里执行其他任务完成后的操作}
}

在这个示例中,将之前的CoroutineCallback委托类型替换为Action类型,也可以替换成UnityAction类型,其他代码保持不变。

使用Action回调函数实现了与之前示例相同的功能,可以根据需要修改这个示例,以便在你自己的项目中使用协程和Action回调。


上面的回调函数都是没有带参数返回的,接下来是关于带参数的回调函数用法,顺便也使用UnityAction来举例子

using System;
using System.Collections;
using UnityEngine;public class TaskExampleWithUnityAction : MonoBehaviour
{private void Start(){StartCoroutine(WaitAndExecute(3f, (int count) =>{Debug.Log($"延时3秒后执行回调,参数值:{count}");}));}// 协程方法private IEnumerator WaitAndExecute(float delay, UnityAction<int> callback){// 等待指定的时间yield return new WaitForSeconds(delay);// 执行回调函数,并传递一个整数参数callback?.Invoke(10);}
}

在这个示例中,修改了协程方法WaitAndExecute,将Action类型替换为Action< int >类型,表示回调函数接受一个整数参数。在协程方法中,调用回调函数时传递了一个整数值

可以根据需要使用不同类型的参数(例如Action< string >、Action< float >等)或多个参数(例如Action< int, string ,bool >)来满足自己的需求,只需用逗号分隔即可,例如:

using System;
using System.Collections;
using UnityEngine;public class TaskExampleWithUnityAction : MonoBehaviour
{private void Start(){//Lambda表达式//StartCoroutine(WaitAndExecute(3f, (int count,string message) =>//{//    Debug.Log($"延时3秒后执行回调,参数值:{count},{message}");//}));//或者StartCoroutine(WaitAndExecute(3f,TaskCompleted));}// 协程方法private IEnumerator WaitAndExecute(float delay, UnityAction<int,string> callback){// 等待指定的时间yield return new WaitForSeconds(delay);// 执行回调函数,并传递一个整数和字符串callback?.Invoke(8,"Hello");}// 任务完成的回调函数private void TaskCompleted(int count,string message){Debug.Log($"延时3秒后执行回调,参数值:{count},{message}");}
}

以上就是协程中回调函数的使用用法,如有不清楚的可评论区留言


http://www.ppmy.cn/news/64111.html

相关文章

Window下载Android源码

Android 10源码下载 想要研究Android 源码的同学可以用此方法进行下载。源码从清华大学开源软件镜像站&#xff08;https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/&#xff09;下载。 使用Linux的同学直接参照清华镜像站提供的使用帮助(https://mirrors.tuna.tsinghua.edu…

修改lib64/l.ibc.so6导致系统命令都不能用

问题&#xff1a;想升级libc-2.12.so到libc2.17&#xff0c;拷贝了一个libc2.17到lib64下&#xff0c;然后建立软连接到l.ibc.so6&#xff0c;导致系统除了cd之类的命令&#xff0c;其他都不能使用 报错&#xff1a;relocation error: /usr/lib64/libc.so.6: symbol _dl_start…

肝一肝设计模式【七】-- 代理模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 文…

【shell脚本里的数组】

目录 一、数组的定义方法1、定义数组1.1、使用shell脚本来写出怎么查看这个数组有没有缺少元素1.2、使用shell脚本&#xff0c;来生成数组1.3、元素的切片 二、数组追加元素三、传输和传出1、向函数传入数组的值2、从函数返回数组 一、数组的定义方法 &#xff08; 20 10 60…

企业布局新媒体矩阵,如何走得更远?

企业搭建新媒体矩阵有很多好处——扩大品牌声量、丰富内容形式、提高宣传效率、降低运营风险、节省广告成本...... 即便如此&#xff0c;能真正让新媒体矩阵产生如此效果的企业&#xff0c;却是凤毛麟角。 更多的企业&#xff0c;往往冒然入场&#xff0c;也黯然离场&#xff0…

【iOS】---pthread,NSThread

在iOS中多线程开发有四种方式&#xff0c;在之前我们浅浅了解了一下GCD&#xff0c;这期来看看pthread和NSThread pehread pthread简介 pthread 是一套通用的多线程的 API&#xff0c;可以在Unix / Linux / Windows 等系统跨平台使用&#xff0c;使用 C 语言编写&#xff0c;…

头歌机器学习---决策树

第1关&#xff1a;什么是决策树&#xff1a; 如何构造出一棵好的决策树呢&#xff1f;其实构造决策树时会遵循一个指标&#xff0c;有的是按照信息增益来构建&#xff0c;如ID3算法&#xff1b;有的是信息增益率来构建&#xff0c;如C4.5算法&#xff1b;有的是按照基尼系数来构…

Python并发编程之进程理论

前言 本文将详细介绍进程相关概念。 进程和程序 计算机上的未运行的QQ、Wechat等都属于程序&#xff0c;但是一旦当这些程序运行起来的话&#xff0c;就可以被称为进程。因此可以如下定义程序和进程&#xff1a; 程序&#xff1a;就是存在硬盘上的一堆代码。 进程&#xf…