好久沒有來更新博客了,快一年了吧,主要是上班之後就一直在加班啊.... 就沒有時間寫博客,看書倒一直沒有中斷。
工作後的項目一直在用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