EnergyEfficiencyManagement/Assets/SKFramework/Core/Task/TaskManager.cs

107 lines
2.5 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace SK.Framework
{
public class TaskManager
{
public static TaskManager Instance { get; } = new TaskManager();
private readonly List<TaskData> _tasks = new List<TaskData>();
private int _currentTaskIndex = -1;
private TaskMode _mode = TaskMode.Teach;
public TaskData CurrentTask =>
(_currentTaskIndex >= 0 && _currentTaskIndex < _tasks.Count)
? _tasks[_currentTaskIndex]
: null;
public void AddTask(TaskData task)
{
_tasks.Add(task);
}
public void SetMode(TaskMode mode)
{
_mode = mode;
Debug.Log($"[TaskManager] Mode = {_mode}");
}
public void Start()
{
if (_tasks.Count == 0)
return;
_currentTaskIndex = 0;
StartCurrentTask();
}
private void StartCurrentTask()
{
if (_currentTaskIndex >= _tasks.Count)
{
Debug.Log("[TaskManager] 所有任务完成");
return;
}
var task = _tasks[_currentTaskIndex];
task.OnTaskCompleted += OnTaskCompleted;
task.OnTaskFailed += OnTaskFailed;
task.Start(_mode);
}
private void OnTaskCompleted(TaskData task)
{
task.OnTaskCompleted -= OnTaskCompleted;
task.OnTaskFailed -= OnTaskFailed;
_currentTaskIndex++;
StartCurrentTask();
}
private void OnTaskFailed(TaskData task, string reason)
{
// 失败不自动跳任务,由上层系统处理
}
/// <summary>
/// 预留方法
/// </summary>
public void Tick()
{
CurrentTask?.Tick();
}
/// <summary>
/// 外部调用:汇报当前 Step 的结果
/// </summary>
public void ReportCurrentStepResult(bool isError)
{
CurrentTask?.CompleteCurrentStep(isError);
}
/// <summary>
/// 通过stepID跳转步骤
/// </summary>
/// <param name="stepId"></param>
public void JumpToStepById(int stepId)
{
CurrentTask?.JumpToStepById(stepId);
}
public void RestartCurrentTask()
{
if (CurrentTask == null)
return;
CurrentTask.Reset();
CurrentTask.Start(_mode);
}
//跳步s
}
}