在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}");}
}