您现在的位置是:首页 >学无止境 >Unity开发——如何在协程中进行回调网站首页学无止境
Unity开发——如何在协程中进行回调
在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}");
}
}