Unity之简易任务队列TaskQueue

任务队列

该功能包括两个类:Task任务类,TaskQueue任务队列类
其中TaskQueue负责:
1、开始任务
2、添加任务
3、清空任务
4、开始任务回调
5、完成队列中所有任务回调
6、下一个任务
7、当前任务进度
8、队列存储所有任务

其中Task类代码如下:

using System;
using System.Collections;
using System.Collections.Generic;

public class Task 
{
    //任务名
    private string m_TaskName;
    public string TaskName
    {
        set
        {
            m_TaskName = value;
        }
        get
        {
            return m_TaskName;
        }
    }

    //任务具体内容,外部传入
    public Action Work;

    public Task(Action work, string taskName = "defaultTaskName")
    {
        this.Work = work;
        this.m_TaskName = taskName;
    }
}

TaskQueue类代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TaskQueue 
{
    //构造函数
    public TaskQueue()
    {
        m_TaskQueue = new Queue<Task>();
        m_TasksNum = 0;
    }

    //1、添加任务
    public void AddTask(Task task)
    {
        m_TaskQueue.Enqueue(task);
    }

    public void AddTask(Action work)
    {
        Task task = new Task(work);
        m_TaskQueue.Enqueue(task);
    }

    //2、开始任务
    public void Start()
    {
        //获取任务队列的总任务数
        m_TasksNum = m_TaskQueue.Count;

        if (OnStart != null)
        {
            OnStart();
        }
        NextTask();
    }

    //3、清空任务
    public void Clear()
    {
        m_TaskQueue.Clear();
        m_TasksNum = 0;
    }

    //4、开始任务回调
    public Action OnStart = null;

    //5、完成所有任务回调
    public Action OnFinish = null;

    //6、下一个任务
    private void NextTask()
    {
        if (m_TaskQueue.Count > 0)
        {
            Task task = m_TaskQueue.Dequeue();
            task.Work();
            NextTask();
        }
        else
        {
            if (OnFinish != null)
            {
                OnFinish();
            }
        }
    }

    //7、当前任务进度
    public float TaskProcess
    {
        get
        {
            return 1 - m_TaskQueue.Count * 1.0f / m_TasksNum;
        }
    }

    //8、任务队列总任务量
    private int m_TasksNum = 0;

    //9、任务队列
    private Queue<Task> m_TaskQueue;
}

然后写一个test脚本挂在相机上,测试前面的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour 
{
    void Start () 
    {
        TaskQueue taskQueue = new TaskQueue();
        taskQueue.OnStart = () => { Debug.Log("OnStart"); };
        taskQueue.OnFinish = () => { Debug.Log("OnFinish"); };
        taskQueue.AddTask(Task1);
        taskQueue.AddTask(Task2);
        taskQueue.Start();
    }

    private void Task1()
    {
        Debug.Log("Task1");
    }

    private void Task2()
    {
        Debug.Log("Task2");
    }
}

执行结果如下图:
这里写图片描述

该任务队列写的比较简单,后期会拓展,敬请期待。

以上知识分享,如有错误,欢迎指出,共同学习,共同进步。

猜你喜欢

转载自blog.csdn.net/qq_26999509/article/details/74898317
今日推荐