Как правило, вы должны вызывать FindObjectOfType<GameController>()
только один раз, например, при запуске
private GameController _gameController;
private void Start()
{
_gameController= FindObjectOfType<GameController>();
}
и затем использовать эту ссылку _gameController
везде вместо FindObjectOfType<GameController>()
.
То же самое для WallText
in GameController
:
public TextMesh WallText;
private void Start()
{
WallText = GameObject.Find("WallText").GetComponent<TextMesh>();
RandText();
}
public void RandText()
{
word = Strings[Random.Range(0, Strings.Length)];
WallText.text = word;
}
было бы лучше, если бы вы уже ссылались на них в Инспекторе в Unity с помощью перетаскивания, чем вообще не нужно использовать Find
Чем ваша проблема: Вы устанавливаете новое значение для word
в каждой итерации цикла
foreach (string stringAnsers in StringAns)
{
if (stringAnsers.Equals(FindObjectOfType<GameController>().word))
{
Debug.Log("Button has been looked at");
FindObjectOfType<GameController>().RandText();
}
else
{
Debug.Log("Button has been looked at");
FindObjectOfType<GameController>().RandText();
Score++;
}
}
Так что может случиться так, что слово не соответствуетпоэтому вы вызываете Score++;
, но в то же время вы делаете FindObjectOfType<GameController>().RandText();
каждый раз, поэтому новое случайное слово генерируется / выбирается для каждой итерации.
Таким образом, в следующей итерации цикла foreach вы проверяете новоеслучайное слово, которое может совпадать или не совпадать со следующей строкой ответа в списке.
Вместо этого вы должны генерировать только новое случайное слово после цикл выполняется, например, как
foreach (string stringAnsers in StringAns)
{
if (stringAnsers.Equals(FindObjectOfType<GameController>().word))
{
Debug.Log("Button has been looked at-> matched");
Score++;
}
else
{
Debug.Log("Button has been looked at -> didn't match");
}
}
FindObjectOfType<GameController>().RandText();
Обратите внимание, что это все равно добавит 1-3
очков в зависимости от hтеперь многие из приведенных stringAnswer
соответствуют слову.Поэтому вы должны добавить break;
после увеличения Score
один раз, если хотите добавить только 1
.
Используя Linq, вы также можете сделать это только в одной строке вместо цикла:
if(StringAns.Any(answer => string.Equals(answer, _gameController.word)))) Score++;
_gameController.RandText();
или для кнопки No
if(!StringAns.Any(answer => string.Equals(answer, _gameController.word)))) Score++;