【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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章