#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);
как именно вы храните эту ссылку, зависит от вас, конечно, от вас.