hitcaib 2023-02-24 13:37 采纳率: 14.3%
浏览 15
已结题

λ表达式为按钮添加监听事件触发时报错

使用λ表达式为按钮添加监听事件,添加时未报错,但是点击后报错显示数组越界,甚至按钮中的debug都没显示。检查后发现并无数组越界,其他代码也并无问题(取消按钮事件并无报错)


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;


public class Answer_Nine : MonoBehaviour
{
    //读取文档
    string[][] ArrayX;
    string[] lineArray;
    public int topicMax = 3;//最大题数
    private List<bool> isAnserList = new List<bool>();//存放是否答过题的状态
    //加载题目
    public Button[] Buttonlist;//答题Button
    public Text indexText;//当前第几题
    public Text TM_Text;//当前回答
    public List<Text> DA_TextList;//选项
    private int topicIndex = 0;//第几题
    public Text tipsText;//提示信息
    public List<int> Qarray;//存放现有题目数组
    int PosFlag = 0; //位置
    public Transform Pos; //起始位置
    string[] ArrayA = new string[9];//答题数组

    void Start()
    {
        TextCsv_Nine();
        LoadAnswer_Nine();
    }


    /*****************读取txt数据******************/
    void TextCsv_Nine()
    {
        //读取csv二进制文件  
        TextAsset binAsset = Resources.Load("TianKong", typeof(TextAsset)) as TextAsset;
        //读取每一行的内容  
        lineArray = binAsset.text.Split(':');
        //创建二维数组  
        ArrayX = new string[lineArray.Length][];
        //把csv中的数据储存在二维数组中  
        for (int i = 0; i < lineArray.Length; i++)
        {
            ArrayX[i] = lineArray[i].Split(' ');
        }
        // //查看保存的题目数据
        // for (int i = 0; i < ArrayX.Length; i++)
        // {
        //     for (int j = 0; j < ArrayX[i].Length; j++)
        //     {
        //         Debug.Log(ArrayX[i][j]);
        //     }
        // }


    }
    /*****************加载题目******************/
    public void LoadAnswer_Nine()
    {

        indexText.text = "第" + (topicIndex + 1) + "题:";//第几题
        
        
        //随机抽一句诗
        int n = RandomQ();
        //选项数组
        string[] ArrayO = new string[9];
        //加载选项
        //设置正确选项
        for(int i=0;i<ArrayX[n].Length;i++)
        {
            ArrayO[i]=ArrayX[n][i];
        }
        //设置错误选项
        int y = ArrayX[n].Length;
        while (y<=8)
        {
            int l = 1;
            int j = Random.Range(0, lineArray.Length);
            int k = Random.Range(0, ArrayX[j].Length);
                //如果重复则break
            for (int i = 0; i < y; i++)
            {
                if (ArrayX[j][k] == " " || ArrayX[j][k] == "\r"||ArrayX[j][k] == ArrayO[i])
                {

                    l=0;
                }

            }
            if(l==0)
                continue;
            //
            ArrayO[y]=ArrayX[j][k];
            
            y++;
        }
        //打乱顺序并赋值给各按钮
        RandomString(ArrayO);
        for(int i=0;i<ArrayO.Length;i++)
        {
            Buttonlist[i].GetComponentInChildren<Text>().text = ArrayO[i];
            //点击按钮后这里报错了——————————————————————————————————————————
            Buttonlist[i].onClick.AddListener(() => Judge(ArrayO[i],lineArray[n])); 
            Debug.Log(ArrayO[i]);
        }

    }
    //打乱顺序
    public void RandomString(string[] S)
    {
        int index=0;
            for(int i=0;i<S.Length;i++)
            {
                int curindex = Random.Range(i,S.Length);
                string temp = S[index];
                S[index]=S[curindex];
                S[curindex] = temp ;
            }
    }

    public void Correct()
    {
        Debug.Log("what");
        tipsText.text = "恭喜您,回答正确!";
    }
    public void Wrong(string s)
    {
        tipsText.text = "很遗憾,正确选项为"+"“"+s+"”";
    }
    public bool AlreadyQ(int n)
    {
        for(int i = 0;i<Qarray.ToArray().Length;i++)
        {
            if(n==Qarray[i])
            {
                return true;
            }
        }
        return false;
    }
    //下一题
    public void NextQ()
    {
        if(topicIndex < topicMax)
        {
            tipsText.text = "";
            TM_Text.text = "";
            LoadAnswer_Nine();
            Debug.Log(topicIndex);
            topicIndex++;
        }
        else
        {
            UnityEngine.SceneManagement.SceneManager.LoadScene(1);
        }

    }
    //随机抽一句诗
    public int RandomQ()
    {
        while(true)
        {
            int n = Random.Range(0,lineArray.Length);
            if(topicIndex == 0)
            {
                Qarray.Add(n);
                return n;
            }
            else if(!AlreadyQ(n))
            {
                Qarray.Add(n);
                return n;
            }
        }
    }
    //判断排序是否正确
    public void Judge(string St,string S)
    {
        //这里压根没debug出来
        Debug.Log("Hello");
        //答题数组
        TM_Text.text += St;
        Debug.Log(St);
        ArrayA[PosFlag] = St;
        if(PosFlag == S.Length)
        {
            if(TM_Text.text == S)
            {
                Correct();
            }
            else
            {
                Wrong(S);
            }
        }
    }

}

img

img

  • 写回答

1条回答 默认 最新

  • MarkHan_ 2023-02-24 13:48
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    在Lambda表达式中使用循环变量i的值可能会导致问题。在你的代码中,使用Buttonlist[i].onClick.AddListener(() => Judge(ArrayO[i],lineArray[n]))将导致i的值在Lambda表达式执行时被读取,而不是在循环期间的值。这意味着你的Lambda表达式将在循环结束后执行,并且i的值将等于数组的长度(即8),而不是在按钮单击事件添加期间的值。
    -
    解决这个问题的方法是将i的值作为参数传递给Lambda表达式。在你的代码中,你可以使用以下代码:

    Buttonlist[i].onClick.AddListener(() => Judge(ArrayO[i],lineArray[n]));
    

    改为:

    int index = i; // 将i的值保存在另一个变量中
    Buttonlist[i].onClick.AddListener(() => Judge(ArrayO[index],lineArray[n]));
    

    这样,你就可以在Lambda表达式中使用index的值,而不是i的值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月4日
  • 已采纳回答 2月24日
  • 创建了问题 2月24日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效