您现在的位置是:首页 >学无止境 >Unity开发——如何在协程中进行回调网站首页学无止境

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

Mr.Y仙森 2024-06-08 12:00:02
简介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}");
    }
}

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。