87 lines
2.7 KiB
C#
87 lines
2.7 KiB
C#
// SequencerManager.cs
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using TH1_Presentation.Sequencer.Task;
|
||
|
||
/// <summary>
|
||
/// 管理所有ISequencerTask的串行执行。
|
||
/// 确保任何时候只有一个表现任务在运行。
|
||
/// </summary>
|
||
namespace TH1_Presentation.Sequencer{
|
||
public class SequencerManager : MonoBehaviour
|
||
{
|
||
// 单例模式
|
||
public static SequencerManager Instance { get; private set; }
|
||
|
||
private readonly Queue<ISequencerTask> _taskQueue = new Queue<ISequencerTask>();
|
||
private bool _isBusy = false;
|
||
|
||
private void Awake()
|
||
{
|
||
// 标准单例实现
|
||
if (Instance != null && Instance != this)
|
||
{
|
||
Destroy(gameObject);
|
||
return;
|
||
}
|
||
Instance = this;
|
||
// (可选)如果你的管理器需要跨场景存在
|
||
// DontDestroyOnLoad(gameObject);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将一个新的表现任务添加到队列中。
|
||
/// </summary>
|
||
/// <param name="task">要执行的任务。</param>
|
||
public void EnqueueTask(ISequencerTask task)
|
||
{
|
||
if (task == null)
|
||
{
|
||
Debug.LogError("试图添加一个空的任务!");
|
||
return;
|
||
}
|
||
|
||
_taskQueue.Enqueue(task);
|
||
//Debug.Log($"任务 {task.GetType().Name} 已入队。当前队列数量: {_taskQueue.Count}");
|
||
|
||
// 尝试执行下一个任务
|
||
TryProcessNext();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 尝试处理队列中的下一个任务。
|
||
/// </summary>
|
||
private void TryProcessNext()
|
||
{
|
||
// 如果当前正在忙,或者队列为空,则不执行
|
||
if (_isBusy || _taskQueue.Count == 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 标记为忙碌状态
|
||
_isBusy = true;
|
||
|
||
// 从队列中取出下一个任务
|
||
ISequencerTask currentTask = _taskQueue.Dequeue();
|
||
//Debug.Log($"开始执行任务: {currentTask.GetType().Name}. 剩余任务: {_taskQueue.Count}");
|
||
|
||
// 执行任务,并将OnTaskCompleted作为完成回调传入
|
||
currentTask.Execute(OnTaskCompleted);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 当一个任务完成时,由此任务调用此方法。
|
||
/// </summary>
|
||
private void OnTaskCompleted()
|
||
{
|
||
//Debug.Log("一个任务已完成。");
|
||
|
||
// 解除忙碌状态
|
||
_isBusy = false;
|
||
|
||
// 立即尝试处理队列中的下一个任务
|
||
TryProcessNext();
|
||
}
|
||
}
|
||
} |