Аргумент вне исключений кроме этого нет? C # единство - PullRequest
0 голосов
/ 31 августа 2018

Я действительно новичок в кодировании, и у меня возникла первая проблема ... Через 4 часа после ее просмотра я понимаю, что, возможно, мне нужна помощь.

Код предназначен для 4 кнопок, каждая из которых имеет очень похожий код (на самом деле почти идентичный, за исключением переменной ID), однако 2 из них при загрузке говорят «аргументoutofrangeexception index», несмотря на то, что индекс такой же. (или я так думаю)

Я связал ниже код для одной из не работающих кнопок и еще одной кнопки, которая работает + контрольный контроль:

НЕ РАБОЧАЯ КНОПКА

public class Answer3script : MonoBehaviour {
    List<string> thirdchoice = new List<string>() { "first choice", "second choice", "third choice", "fourth", "fifth"};
    public static string answerCorrect3 = "n";

    void Update () {
        if (Textcontrol.randQuestion > -1)
        {
            GetComponentInChildren<Text>().text = thirdchoice[Textcontrol.randQuestion];
        }

        if (Textcontrol.correctAnswer[Textcontrol.randQuestion] == Textcontrol.buttonSelected)
        {
             answerCorrect3 = "y";
        }
    }
}

РАБОЧАЯ КНОПКА

public class Answer2script : MonoBehaviour {
    List<string> secondchoice = new List<string>() { "first choice", "second choice", "third choice", "fourth choice", "fifth choice" };
    public static string answerCorrect2 = "n";

    void Update () {
        if (Textcontrol.randQuestion > -1)
        {
            GetComponentInChildren<Text>().text = secondchoice[Textcontrol.randQuestion];
        } 

        if (Textcontrol.correctAnswer[Textcontrol.randQuestion] == Textcontrol.buttonSelected)
        {
            answerCorrect2 = "y";

            //   if (answerCorrect2 == "y")
            //  {
            //      image.color = Color.green;
            //  }
        }
    }
}

УПРАВЛЕНИЕ ТЕКСТОМ:

public class Textcontrol : MonoBehaviour {
    List<string> questions = new List<string>() { "This is the first question", "second", "third", "fourth", "fifth" };
    public static List<string> correctAnswer = new List<string>() { "Answer1", "Answer2", "Answer3", "Answer4", "Answer4" };

     public static string buttonSelected;
     public static string choiceSelected = "n";
     public static int randQuestion=-1;

     void Update () {
         Image image  = GameObject.Find("Answer1").GetComponent<Image>();
         Image image2 = GameObject.Find("Answer2").GetComponent<Image>();
         Image image3 = GameObject.Find("Answer3").GetComponent<Image>();
         Image image4 = GameObject.Find("Answer4").GetComponent<Image>();

         if (randQuestion == -1)
         {
             randQuestion = Random.Range(0, 5);
         }

         if (randQuestion > -1)
         {
             GetComponent<Text>().text = questions[randQuestion];
         }

         if (choiceSelected == "y")
         {
             choiceSelected = "n";

             if (correctAnswer[randQuestion] == buttonSelected)
             {
                 Debug.Log("Correct!");
             }
         }
     }
}

Извиняюсь за действительно плохо отформатированный код, я не смог заставить его работать!

1 Ответ

0 голосов
/ 31 августа 2018

У вас есть условие гонки здесь! Update из Answer3script может быть вызвано раньше, чем Textcontrol, поэтому randQuestion может иметь значение по умолчанию -1

Раствор 1

Вместо первого if вы могли бы в обоих Update() просто сделать

private void Update()
{
    // Check if Textcontrol values are set already
    if (Textcontrol.randQuestion < 0 || Textcontrol.correctAnswer.Count < Textcontrol.randQuestion + 1 || Textcontrol.correctAnswer[Textcontrol.randQuestion] == null ) return;

    // ....
}

так что если Textcontrol еще не готов, то ничего не происходит.

Второе условие || Textcontrol.correctAnswer.Count < Textcontrol.randQuestion + 1 гарантирует, что элемент с индексом, к которому вы пытаетесь обратиться, существует в списке.

Имейте в виду, что значения string могут быть null! Поэтому третье условие || Textcontrol.correctAnswer[Textcontrol.randQuestion] == null гарантирует, что значение в индексе, к которому вы обращаетесь, действительно имеет допустимое значение. Если вы также хотите избежать пустой строки (""), вы можете также расширить ее до || string.IsNullOrEmpty(Textcontrol.correctAnswer[Textcontrol.randQuestion])


Решение 2

(я бы предпочел решение 1)

Перейти к Edit -> Project Settings -> Script Execution Order
enter image description here

Нажмите на + и добавьте два сценария Answer2Script и Answer3Script. Вы также можете просто перетащить их (один за другим на поле). Без указания Textcontrol определенного времени выполнения здесь оно будет выполнено в блоке DefualtTime. Так что просто убедитесь, что ваши два сценария после DefaultTime. Чем ударил Apply. Это гарантирует, что ваши два сценария всегда выполняются после Default Time -> после Textcontrol.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...