好久没有来更新博客了,快一年了吧,主要是上班之后就一直在加班啊.... 就没有时间写博客,看书倒一直没有中断。
工作后的项目一直在用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