【Unity】协程

好久没有来更新博客了,快一年了吧,主要是上班之后就一直在加班啊.... 就没有时间写博客,看书倒一直没有中断。


工作后的项目一直在用cocos2dx来做,也没有什么比较值得拿出来分享的,下一个项目 组里面打算用Unity来做,所以就稍微再研究一下Unity。


我打算做一个脱离Unity的底层库,但是Unity也可以用,所以不可避免的就需要重复造一些轮子,所以这次打算造的轮子是Unity的协程。


懒得详细说了,直接贴代码吧。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FirBase
{
    public interface ITaskItem
    {
        bool CanNext();
    }

    /// <summary>
    /// 
    /// </summary>
    public class WaitForEndOfFrame : ITaskItem
    {
        public WaitForEndOfFrame()
        {

        }

        public bool CanNext()
        {
            return true;
        }
    }

    public class WaitForSecond : ITaskItem
    {
        DateTime _initTime = DateTime.Now;
        TimeSpan _waitTime;
        public WaitForSecond(TimeSpan waitTime)
        {
            _waitTime = waitTime;
        }

        public bool CanNext()
        {
            if ((_initTime + _waitTime) < DateTime.Now)
                return true;
            return false;
        }
    }

    /// <summary>
    ///  协程管理类
    /// </summary>
    public class FirTask : FirSingleton<FirTask>
    {
        List<IEnumerator> _taskList = new List<IEnumerator>();

        public void AddTask(IEnumerator newTask)
        {
            _taskList.Add(newTask);
        }

        public void DoTask()
        {
            for (int i = _taskList.Count - 1; i >= 0; --i )
            {
                var item = _taskList[i];
                var curTask = (ITaskItem)item.Current;
                if (curTask != null)
                {
                    if (curTask.CanNext())
                    {
                        if (!item.MoveNext())
                        {
                            _taskList.Remove(item);
                        }
                    }
                }
                else
                {
                    if (!item.MoveNext())
                    {
                        _taskList.Remove(item);
                    }
                }
            }
        }
    }
}


以下是测试代码:

        public static IEnumerator test()
        {
            FirLog.v<Program>("11111");
            yield return new WaitForSecond(new TimeSpan(0, 0, 5));
            FirLog.v<Program>("222");
        }

        static void Main(string[] args)
        {
            FirLog.v<Program>("init");
            FirTask.Instance.AddTask(test());
            while(true)
            {
                FirTask.Instance.DoTask();
            }
        }


测试结果:


demo在这里,这篇博客一最后

http://blog.csdn.net/nxshow/article/details/51067764


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值