Unity游戏框架设计之协程管理器
代码设计
/*
* 协程管理器
*/
public class CoroutineManager : SingletonMono<CoroutineManager>
{
/**
* 创建 CoroutineTask
*/
public CoroutineTask CreateCoroutine(IEnumerator coroutine, Action<bool> finishHandler = null, bool autoStart = true)
{
CoroutineTask coroutineTask = new CoroutineTask(coroutine, finishHandler);
if (autoStart)
{
coroutineTask.Start();
}
return coroutineTask;
}
/**
* 拓展一个协程
*/
public IEnumerator ExtendCoroutine(IEnumerator coroutine, Action callback)
{
yield return coroutine;
callback();
}
/**
* 拥有生命周期的协程
*/
public class CoroutineTask
{
private readonly IEnumerator _coroutine; // 协程
private bool _running; // 是否执行中
private bool _paused; // 是否已暂停
private bool _stopped; // 是否已停止
// 协程执行完成的回调函数。无论是协程执行完毕,还是协程被执行 Stop() 而终止,都执行此方法。
// 参数为 true 当前仅当手动执行 Stop() 函数使得协程被终止。
private readonly Action<bool> _finishHandler;
private CoroutineTask _next; // 当前 CoroutineTask 执行完毕后,继续执行的下一个的 CoroutineTask。解决地狱回调问题。
public CoroutineTask(IEnumerator coroutine, Action<bool> finishHandler = null)
{
_coroutine = coroutine;
_running = _paused = _stopped = false;
_finishHandler = finishHandler;
}
public CoroutineTask Next(IEnumerator coroutine, Action<bool> finishHandler = null)
{
_next = new CoroutineTask(coroutine, finishHandler);
return _next;
}
public void Start()
{
_running = true;
CoroutineManager.Instance.StartCoroutine(StarTask());
}
public void Pause()
{
_paused = true;
}
public void Unpause()
{
_paused = false;
}
public void Stop()
{
_stopped = true;
_running = false;
}
private IEnumerator StarTask()
{
// yield return null;
while (_running)
{
if (_paused)
{
yield return null;
}
else
{
if (_coroutine != null && _coroutine.MoveNext())
{
yield return _coroutine.Current;
}
else
{
_running = false;
}
}
}
if (_finishHandler != null)
{
_finishHandler(_stopped);
}
if (_next != null)
{
_next.Start();
}
}
}
}
代码说明
代码参考 Github 上 krockot/Unity-TaskManager 的 TaskManager.cs 实现。
(一)所有协程统一在一个对象上执行。防止协程执行过程中,由于游戏对象被禁用,导致协程中断执行的问题。
(二)对协程进行生命周期控制,允许对协程执行开始,暂停与终止操作。
(三)允许配置协程执行完毕时的回调函数。
(四)解决协程的地狱回调问题。
后记
由于个人能力有限,文中不免存在疏漏,恳求大家斧正,一起交流,共同进步。
标签:CoroutineTask,之协程,协程,coroutine,Unity,管理器,null,public,finishHandler From: https://www.cnblogs.com/kkelin/p/18166680