Unity之简易任务队列TaskQueue

来源:互联网 发布:网络招聘怎么写 编辑:程序博客网 时间:2024/06/05 22:36

任务队列

该功能包括两个类: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");    }}

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

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

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