Unity TaskManager协程任务管理器

using System.Collections;
using UnityEngine;

namespace Epitome
{
    public class Task
    {
        TaskManager.TaskState task;

        public bool Running { get { return task.Running; } }

        public bool Paused { get { return task.Paused; } }

        public delegate void FinishedHandler(bool manual);

        public event FinishedHandler Finished;

        public Task(IEnumerator c,bool autoStart = true)
        {
            task = TaskManager.CreateTask(c);
            task.Finished += TaskFinished;
            if (autoStart)
            {
                task.Start();
            }
        }

        public void Start()
        {
            task.Start();
        }
 
        public void Stop()
        {
            task.Stop();
        }

        public void Pause()
        {
            task.Pause();
        }

        public void UnPause()
        {
            task.UnPause();
        }

        void TaskFinished(bool manual)
        {
            FinishedHandler handler = Finished;
            if (handler != null)
                handler(manual);
        }
    }

    public class TaskManager : MonoSingleton<TaskManager>
    {
        public class TaskState
        {
            bool running;
            bool paused;
            bool stopped;

            public bool Running { get { return running; } }

            public bool Paused { get { return paused; } }

            public delegate void FinishedHandler(bool manual);

            public event FinishedHandler Finished;

            IEnumerator coroutine;

            public TaskState(IEnumerator c)
            {
                coroutine = c;
            }

            public void Pause()
            {
                paused = true;
            }

            public void UnPause()
            {
                paused = false;
            }

            public void Start()
            {
                running = true;
                TaskManager.Instance.StartCoroutine(CallWrapper());
            }

            public void Stop()
            {
                stopped = true;
                running = false;
            }

            IEnumerator CallWrapper()
            {
                yield return null;

                IEnumerator e = coroutine;
                while (running)
                {
                    if (paused)
                    {
                        yield return null;
                    }
                    else
                    {
                        if (e != null && e.MoveNext())
                        {
                            yield return e.Current;
                        }
                        else
                        {
                            running = false;
                        }
                    }
                }

                FinishedHandler handle = Finished;
                if (handle != null)
                {
                    handle(stopped);
                }
            }
        }

        public static TaskState CreateTask(IEnumerator coroutine)
        {
            return new TaskState(coroutine);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JIQIU.YANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值