61 lines
2.7 KiB
C#
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;
|
|
}
|
|
}
|
|
} |