Задержка в цикле 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() , который выполняется каждый кадр? И без ожиданий?
Насколько я понял задача это мутант 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 = "";
}
}