Как повторно выполнять метод, пока не будет указано иное

#c# #unity3d

Вопрос:

У меня есть система событий для управления моей пошаговой игрой в Unity.

 public class EventSystem : MonoBehaviour
{
    private static List<Action> _commandsQueue = new List<Action>();

    private bool _canExecuteCommand = true;

    public void AddToQueue(Action command)
    {
        _commandsQueue.Add(command);
    }

    private void StartCommandExecution()
    {
        _commandsQueue[0]();
        _canExecuteCommand = false;
    }

    public void CommandExecutionComplete()
    {
        _canExecuteCommand = true;
    }

    public void PlayFirstCommandFromQueue()
    {
        if (_commandsQueue.Any() amp;amp; _canExecuteCommand)
        {
            StartCommandExecution();
        }
        else
        {
            Debug.LogError("No Command In Queue");
        }
    }
}
 

Как мне поместить метод в Update() до тех пор, пока _canExecuteCommand снова не станет истинным, но только для некоторых методов?

Комментарии:

1. Чего вы пытаетесь достичь ?

2.Поскольку ваш вопрос в настоящее время находится — он очень широк. «Как казнить, пока я не скажу иначе?» Бросьте его в петлю, for , while do...while , и т. Д. Мы можем предоставить вам лучшие ответы с дополнительной информацией о том, чего вы в настоящее время пытаетесь достичь и почему!

Ответ №1:

Это довольно широкое то, что вы пытаетесь сделать, но в целом вы бы использовали бесконечный цикл внутри сопрограммы.

Вы можете создать универсальную процедуру, которая вызывает все Action , что вы передаете в качестве параметра один раз в кадре, например

 private IEnumerator InvokeEveryFrame(Action action)
{
    // This looks strange but is okey in a Coroutine as long as you yield somewhere within
    while(true)
    {
        action?.Invoke();

        // This tells Unity to "pause" this routine here
        // render the current frame and continue from here in the next frame
        yield return null;
    }
}
 

Так что все, что осталось, — это начать рутину, используя MonoBehaviour.StartCoroutine , например,

 Coroutine routine = StartCoroutine(SomeParameterlessMethod);
 

или, если вам нужны параметры

 Coroutine routine = StartCoroutine(() => SomeMethod(x, y, z));
 

а затем в какой-то момент позже прекратите его использовать MonoBehaviour.StopCoroutine , а сохраненную Coroutine ссылку, например, например

 StopCoroutine(routine);
 

как именно вы храните эту ссылку, зависит от вас, конечно, от вас.