协程管理工具

这个工具是本人基于TaskManager改动来的
通过两个脚本来对协程进行管理
1.TaskManager
这个脚本主要用来控制Task,包括添加,开启,获取Task的状态等等,只需要输入Task对应的名称,即可进行相关的操作

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.WindowsRuntime;
using UnityEngine;

public class TaskManager : SingletonMono<TaskManager> {
	/// <summary>
	/// 存放当前所有的Task
	/// </summary>
	private Dictionary<string, Task> task_Dic=new Dictionary<string, Task>();
	/// <summary>
	/// 创建Task
	/// </summary>
	/// <param name="name"></param>
	/// <param name="enumerator"></param>
	public bool CreateTask(string name,IEnumerator enumerator,bool AutoStart=false)
	{
		if (task_Dic.ContainsKey(name))
		{
			Debug.LogWarning("存在重复的Task");
			return false;
		}
		Task newTask = new Task(enumerator);
		task_Dic.Add(name, newTask);
		if (AutoStart)
		{
			StartTask(name);
		}
		return true;
	}
	/// <summary>
	/// 创建延迟调用的Task
	/// </summary>
	public bool CreateDelayTask(string name, IEnumerator enumerator,float delayTime, bool AutoStart = false)
	{
		if (task_Dic.ContainsKey(name))
		{
			Debug.LogWarning("存在重复的Task");
			return false;
		}
		Task newTask = new Task(enumerator,delayTime);
		task_Dic.Add(name, newTask);
		if (AutoStart)
		{
			StartTask(name);
		}
		return true;
	}
	/// <summary>
	/// 开启某个Task
	/// </summary>
	/// <param name="taskName"></param>
	public void StartTask(string taskName)
	{
		task_Dic[taskName].TaskStart();
		task_Dic[taskName].TaskCor=StartCoroutine(task_Dic[taskName].CallWrapper());
	}
	/// <summary>
	/// 关闭某个Task
	/// </summary>
	/// <param name="taskName"></param>
	public void StopTask(string taskName)
	{
		if (task_Dic[taskName].TaskCor!=null)
		{
			StopCoroutine(task_Dic[taskName].TaskCor);
			task_Dic[taskName].TaskCor = null;
		}
		
	}
	/// <summary>
	/// 暂停某个Task
	/// </summary>
	/// <param name="taskName"></param>
	public void PausedTask(string taskName)
	{
		task_Dic[taskName].TaskPaused();
	}
	/// <summary>
	/// 继续某个Task
	/// </summary>
	/// <param name="taskName"></param>
	public void UnpausedTask(string taskName)
	{
		task_Dic[taskName].TaskUnpaused();
	}
	/// <summary>
	/// 清理已经执行完毕的task
	/// </summary>
	public void ClearStopTask()
	{
		foreach (var item in task_Dic)
		{
			if (item.Value.Running==false)
			{
				StopTask(item.Key);
			}
		}
	}
	/// <summary>
	/// 通过名称获取某个Task
	/// </summary>
	/// <param name="name"></param>
	/// <returns></returns>
	public Task TaskSearch(string name)
	{
		Task task = null;
		if (task_Dic.ContainsKey(name))
		{
			task = task_Dic[name];
		}
		return task;
	}
}

2.Task
用来管理协程的具体执行流程

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

public class Task {

	private bool _paused;
	private bool _running;
	/// <summary>
	/// 是否暂停
	/// </summary>
	public bool Paused
	{
		get
		{
			return _paused;
		}
	}
	/// <summary>
	/// 是否正在运行
	/// </summary>
	public bool Running
	{
		get
		{
			return _running;
		}
	}
	/// <summary>
	/// 延迟执行的时间
	/// </summary>
	private float _delayTime;
	private IEnumerator _enumerator;
	public Coroutine TaskCor;
	public Task(IEnumerator enumerator)
	{
		_enumerator = enumerator;
	}
	public Task(IEnumerator enumerator, float delayTime)
	{
		_enumerator = enumerator;
		_delayTime = delayTime;
	}
	public IEnumerator CallWrapper()
	{
		yield return new WaitForSeconds(_delayTime);
		IEnumerator e = _enumerator;
		while (_running)
		{
			if (_paused)
				yield return null;
			else
			{
				if (e != null && e.MoveNext())
				{
					yield return e.Current;
				}
				else
				{
					_running = false;
					
				}
			}
		}
	}
	
	public void TaskPaused()
	{
		_paused = true;
	}
	public void TaskUnpaused()
	{
		_paused = false;
	}
	public void TaskStart()
	{
		_running = true;
	}
	
}


注: 第一个TaskManager里面继承的SingletonMono就是一个单例
附上单例的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 继承mono的单例类
/// </summary>
/// <typeparam name="T">T用来指明类</typeparam>
public class SingletonMono<T> : MonoBehaviour where T : SingletonMono<T> 
{

	private static T instance;

	public static T Instance
	{
		get
		{
			if (instance==null)
			{
				//看是否已经创建了该物体
				T _instance = FindObjectOfType<T>();
				if (_instance==null)
				{
					GameObject go = new GameObject(typeof(T).Name);
					instance = go.AddComponent<T>();
					DontDestroyOnLoad(go);
				}
				else
				{
					instance = _instance;
				}
			}
			return instance;
		}
	}
}

这个方法有个问题 就是协程不能二次开启 暂时没有找到解决的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python协程是一种轻量级的多任务并发方法,它可以在单线程实现并发执行。asyncio是Python 3.4版本之后新增的标准库,提供了对异步IO的支持,可以用于编写高效的异步IO应用程序。asyncio协程被称为coroutine,使用async关键字定义。 在asyncio,可以使用async关键字定义协程,使用await关键字来等待协程执行完成。同时,asyncio提供了事件循环(event loop)来管理协程的执行。事件循环是一个类似于死循环的机制,在其不断地检查协程的状态并执行它们。 下面是一个简单的使用asyncio的例子: ```python import asyncio async def hello(): print("Hello") await asyncio.sleep(1) print("World") loop = asyncio.get_event_loop() loop.run_until_complete(hello()) ``` 在上面的代码,我们定义了一个协程hello,它先输出“Hello”,然后等待1秒钟,最后输出“World”。我们使用事件循环来执行这个协程。 asyncio还提供了一些常用的工具函数和类,例如: - asyncio.get_event_loop():获取事件循环对象。 - asyncio.sleep():让协程等待一段时间。 - asyncio.gather():并发执行多个协程。 - asyncio.ensure_future():将协程加入事件循环。 - asyncio.Queue():实现协程之间的消息传递。 使用asyncio可以方便地编写高效的异步IO应用程序。但需要注意的是,在使用asyncio时,应该尽量避免阻塞操作,因为阻塞操作会阻塞事件循环的执行,影响程序的性能。如果需要进行阻塞操作,可以使用asyncio提供的线程池或进程池来进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值