using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace RR.Common.Behaviour
{
///
/// Компонент для последовательного выполнения списка действий (SequenceAction).
/// Позволяет создавать цепочки действий, которые выполняются одно за другим.
///
public class Sequencer : MonoBehaviour
{
///
/// Список действий для последовательного выполнения.
/// Каждое действие выполняется после завершения предыдущего.
///
[Header("Последовательность действий")]
[SerializeReference] public List actions = new();
///
/// Флаг, указывающий, выполняется ли последовательность в данный момент.
///
protected bool IsExecuting;
///
/// Запускает выполнение последовательности действий для текущего игрового объекта.
///
public void InitializeSequence()
{
StartCoroutine(ExecuteSequence(gameObject));
}
///
/// Запускает выполнение последовательности действий для указанного игрового объекта.
///
/// Целевой игровой объект, над которым будут выполняться действия.
public void InitializeSequence(GameObject target)
{
StartCoroutine(ExecuteSequence(target));
}
///
/// Корутина, последовательно выполняющая все действия из списка.
/// Пропускает null-элементы в списке.
///
/// Целевой игровой объект для выполнения действий.
/// IEnumerator для работы корутины.
protected virtual IEnumerator ExecuteSequence(GameObject target)
{
IsExecuting = true;
foreach (SequenceAction action in actions.Where(action => action != null))
{
yield return StartCoroutine(action.Execute(this, target));
}
IsExecuting = false;
}
}
}