61 lines
2.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace RR.Common.Behaviour
{
/// <summary>
/// Компонент для последовательного выполнения списка действий (SequenceAction).
/// Позволяет создавать цепочки действий, которые выполняются одно за другим.
/// </summary>
public class Sequencer : MonoBehaviour
{
/// <summary>
/// Список действий для последовательного выполнения.
/// Каждое действие выполняется после завершения предыдущего.
/// </summary>
[Header("Последовательность действий")]
[SerializeReference] public List<SequenceAction> actions = new();
/// <summary>
/// Флаг, указывающий, выполняется ли последовательность в данный момент.
/// </summary>
protected bool IsExecuting;
/// <summary>
/// Запускает выполнение последовательности действий для текущего игрового объекта.
/// </summary>
public void InitializeSequence()
{
StartCoroutine(ExecuteSequence(gameObject));
}
/// <summary>
/// Запускает выполнение последовательности действий для указанного игрового объекта.
/// </summary>
/// <param name="target">Целевой игровой объект, над которым будут выполняться действия.</param>
public void InitializeSequence(GameObject target)
{
StartCoroutine(ExecuteSequence(target));
}
/// <summary>
/// Корутина, последовательно выполняющая все действия из списка.
/// Пропускает null-элементы в списке.
/// </summary>
/// <param name="target">Целевой игровой объект для выполнения действий.</param>
/// <returns>IEnumerator для работы корутины.</returns>
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;
}
}
}