任务队列
该功能包括两个类: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");
}
}
执行结果如下图:
该任务队列写的比较简单,后期会拓展,敬请期待。
以上知识分享,如有错误,欢迎指出,共同学习,共同进步。