107 lines
2.5 KiB
C#
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
|
|
}
|
|
}
|