为了账号安全,请及时绑定邮箱和手机立即绑定

Argumentoutofrangeexception 除了它不是?C# 统一

Argumentoutofrangeexception 除了它不是?C# 统一

C#
互换的青春 2021-12-25 16:44:02
我对编码真的很陌生,我遇到了我的第一个问题......看过它 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;             }         }     }}为格式非常糟糕的代码道歉,我无法让它工作!
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

你在这里有一个竞争条件!在Update中Answer3script 的一个前可能被称为Textcontrol所以randQuestion仍可以有默认值-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

//img1.sycdn.imooc.com//61c6d9f8000180dc03040317.jpg

单击+并添加您的两个脚本Answer2ScriptAnswer3Script. 您也可以简单地将它们(一个一个地拖到该字段上)。这里没有给出Textcontrol特定的执行时间,它将在 DefualtTime 块中执行。因此,只要确保你的两个脚本之后DefaultTime。比打Apply。这可确保您的两个脚本始终在Default Time-> after 之后执行Textcontrol


//img1.sycdn.imooc.com//61c6da03000153b802910335.jpg

查看完整回答
反对 回复 2021-12-25
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信