猿问

Argumentoutofrangeexception 除了它不是?C# 统一

我对编码真的很陌生,我遇到了我的第一个问题......看过它 4 小时后,我意识到我可能需要一些帮助。


该代码用于 4 个按钮,所有按钮的代码都非常相似(实际上除了 ID 变量外几乎相同),但其中 2 个在加载时说 'argumentoutofrangeexception 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;


             }

         }

     }

}

为格式非常糟糕的代码道歉,我无法让它工作!


互换的青春
浏览 134回答 1
1回答

慕的地6264312

你在这里有一个竞争条件!在Update中Answer3script 的一个前可能被称为Textcontrol所以randQuestion仍可以有默认值-1方案一而不是第一个if你可以在两者中Update()简单地做private void Update(){&nbsp; &nbsp; // Check if Textcontrol values are set already&nbsp; &nbsp; if (Textcontrol.randQuestion < 0 || Textcontrol.correctAnswer.Count < Textcontrol.randQuestion + 1 || Textcontrol.correctAnswer[Textcontrol.randQuestion] == null ) return;&nbsp; &nbsp; // ....}所以如果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单击+并添加您的两个脚本Answer2Script和Answer3Script.&nbsp;您也可以简单地将它们(一个一个地拖到该字段上)。这里没有给出Textcontrol特定的执行时间,它将在 DefualtTime 块中执行。因此,只要确保你的两个脚本之后的DefaultTime。比打Apply。这可确保您的两个脚本始终在Default Time-> after 之后执行Textcontrol。
随时随地看视频慕课网APP
我要回答