2025-08-22 00:04:58 +08:00

87 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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();
}
}
}