Задержка в цикле Unity

Я хотел, чтобы в игре учувствовало 4 человека (3 бота и 4-ый сам игрок). Я дописал код, но мне нужно сделать так, чтобы главное число менялось с задержкой, а у меня почему-то оно меняется сразу с 1 на 4

[DisallowMultipleComponent]

public class Game : MonoBehaviour
{

    // сделал из слов константы, что бы не было опечаток в их многократном написании
    private const string Fizz = "Fizz";
    private const string Buzz = "Buzz";
    // поскольку поля исключительно для внутреннего пользования то private, а не public
    // SerializeField позволяет сделать их видимыми в редакторе
    [SerializeField] private Text _numberLabel;
    [SerializeField] private Text[] _answerLabels = new Text[4];
    private int _number, player_id = 1;
    TimeSpan interval = new TimeSpan(0, 0, 2);

    private void Start()
    {
        _number = 1;
        FizzBuzz();
    }

    private void NewQuiz(int number)
    {
        if (_numberLabel != null)
            _numberLabel.text = number.ToString();
        string[] Answers = GetShuffleAnswers(number);
        for (int i = 0; i < _answerLabels.Length && i < Answers.Length; i++)
            if (_answerLabels != null)
                _answerLabels[i].text = Answers[i];
    }

    // в OnClick можно указывать одиночные аргументы
    public void Choise(int index)
    {
        if (index >= 0 && index < _answerLabels.Length && _answerLabels[index] != null)
        {
            if (GetTrueAnswer(_number) == _answerLabels[index].text)
                Success();
            else
                Fail();
        }
    }

    private void FizzBuzz()
    {
        while(player_id != 4)
        {
            BotAnswer();
            player_id++;
            Thread.Sleep(interval);
        }
        NewQuiz(_number);
        player_id++;
        if (n > 4)
            n = 1;
        if (n < 0)
            n = 4;
    }

    private void BotAnswer()
    {
        _numberLabel.text = GetTrueAnswer(_number);
        _number++;
    }

    private void Success()
    {
        _number++;
        FizzBuzz();
    }

    private void Fail()
    {
        ClearButtonLables();
        if (_numberLabel != null)
            _numberLabel.text = "ERROR";
    }

    // выдаёт перетасованный масив ответов для числа
    private string[] GetShuffleAnswers(int number)
    {
        string[] Labels = { number.ToString(), Fizz, Buzz, Fizz + Buzz };
        for (int i = 0; i < Labels.Length; i++)
        {
            int RandomIndex = UnityEngine.Random.Range(0, Labels.Length);
            if (i != RandomIndex)
            {
                string Temp = Labels[i];
                Labels[i] = Labels[RandomIndex];
                Labels[RandomIndex] = Temp;
            }
        }
        return Labels;
    }

    // выдаёт правильный ответ для числа
    private string GetTrueAnswer(int number)
    {
        string TrueAnswer = "";
        if (_number % 3 == 0)
            TrueAnswer += Fizz;
        if (_number % 5 == 0)
            TrueAnswer += Buzz;
        if (TrueAnswer == "")
            TrueAnswer = number.ToString();
        return TrueAnswer;
    }

    private void ClearButtonLables()
    {
        foreach (Text text in _answerLabels)
            if (text != null)
                text.text = "";
    }
}

Ответы (2 шт):

Автор решения: Максим Фисман

Если вы в корутине не укажите WaitFor... то она будет вся пытаться выполниться в одном кадре. Как же указали - зависнет при значении 4, так как бесконечно будет выполняться 3-е условие, а вообще не понятен смысл этой объемной корутины. Может будет легче реализовать что-то подобное через Update() , который выполняется каждый кадр? И без ожиданий?

→ Ссылка
Автор решения: Yaroslav

Насколько я понял задача это мутант FizzBuzz и Quiz.

По switch (gameObject.name) видно, что вы вешаете этот скрипт к каждой кнопке и указываете ссылки на все кнопки и тексты для каждой. Сказать что так делать нельзя, не сказать ни чего.

Постоянно повторяются одни и те-же куски и если их вынести в методы, ваш код уже сократится в 2 раза.

Нулевая читабельность. Если человек не знает что такое FizzBuzz и Quiz, то шансов понять, что происходит - 0! Но самое печальное, что даже если знает понимания все равно близко к 0. Что за dir, score и p я не понял.

Как код должен выглядеть:

[DisallowMultipleComponent]

public class FizzBuzz : MonoBehaviour {

    // сделал из слов константы, что бы не было опечаток в их многократном написании
    private const string Fizz = "Fizz";
    private const string Buzz = "Buzz";
    // поскольку поля исключительно для внутреннего пользования то private, а не public
    // SerializeField позволяет сделать их видимыми в редакторе
    [SerializeField] private Text _numberLabel;
    [SerializeField] private Text[] _answerLabels = new Text[4];
    private int _number;

    private void Start () {
        _number = 1;
        NewQuiz(_number);
    }

    private void NewQuiz (int number) {
        if (_numberLabel != null)
            _numberLabel.text = number.ToString();
        string[] Answers = GetShuffleAnswers(number);
        for (int i = 0; i < _answerLabels.Length && i < Answers.Length; i++)
            if (_answerLabels != null)
                _answerLabels[i].text = Answers[i];
    }

    // в OnClick можно указывать одиночные аргументы
    public void Choise (int index) {
        if (index >= 0 && index < _answerLabels.Length && _answerLabels[index] != null) {
            if (GetTrueAnswer(_number) == _answerLabels[index].text)
                Success();
            else
                Fail();
        }
    }

    private void Success () {
        _number++;
        NewQuiz(_number);
    }

    private void Fail () {
        ClearButtonLables();
        if (_numberLabel != null)
            _numberLabel.text = "ERROR";
    }

    // выдаёт перетасованный масив ответов для числа
    private string[] GetShuffleAnswers (int number) {
        string[] Labels = { number.ToString(), Fizz, Buzz, Fizz+Buzz };
        for (int i = 0; i < Labels.Length; i++) {
            int RandomIndex = UnityEngine.Random.Range(0, Labels.Length);
            if (i != RandomIndex) {
                string Temp = Labels[i];
                Labels[i] = Labels[RandomIndex];
                Labels[RandomIndex] = Temp;
            }
        }
        return Labels;
    }

    // выдаёт правильный ответ для числа
    private string GetTrueAnswer (int number) {
        string TrueAnswer = "";
        if (_number%3 == 0)
            TrueAnswer += Fizz;
        if (_number%5 == 0)
            TrueAnswer += Buzz;
        if (TrueAnswer == "")
            TrueAnswer = number.ToString();
        return TrueAnswer;
    }

    private void ClearButtonLables () {
        foreach (Text text in _answerLabels)
            if (text != null)
                text.text = "";
    }
}
→ Ссылка