You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何调试输出自定义类内的二维数组?

解决二维数组输出到控制台的问题

首先咱们先把你代码里的语法错误和逻辑小问题修正掉——这些问题会导致代码连编译都通不过,更别说输出数组内容了:

第一步:修正CustomClass.cs的问题

using System.Text; // 要引入这个才能用StringBuilder

class ScoreBoard
{
    // 把arrTmp改成类的私有字段,这样方法执行完后数组不会被销毁,还能被其他方法访问
    private int[,] arrTmp;
    private int m_lastCnt;

    // 构造函数修正:补全括号
    public ScoreBoard()
    {
        m_lastCnt = 0;
    }

    public void makeBoard(string history)
    {
        // 处理history里的空格:分割时去掉空元素和多余空格
        string[] arrPartStr = history.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries);
        int[] arrPart = new int[arrPartStr.Length];

        for (int c = 0; c < arrPart.Length; c++)
        {
            // 先把每个元素的空格去掉,避免索引访问出错
            string part = arrPartStr[c].Trim();
            int temp = 0;

            // 加长度判断,防止字符串过短导致索引越界
            if (part.Length >= 1 && part[0] == 'P')
                temp = 100;
            else if (part.Length >= 1 && part[0] == 'B')
                temp = 200;
            else
                temp = 300;

            if (part.Length >= 2 && part[1] == 'P')
                temp += 10;
            if (part.Length >= 3 && part[2] == 'P')
                temp += 1;

            arrPart[c] = temp;
        }

        // 初始化二维数组(这里可以根据需求赋值,默认是0)
        arrTmp = new int[6100, 104];
        // 示例赋值:方便测试输出效果
        for(int i=0; i<arrTmp.GetLength(0); i++)
        {
            for(int j=0; j<arrTmp.GetLength(1); j++)
            {
                arrTmp[i,j] = i + j;
            }
        }
    }

    // 添加专门的输出方法,把arrTmp内容打印到控制台
    public void PrintScoreBoardArray()
    {
        if(arrTmp == null)
        {
            Debug.Log("arrTmp还没初始化!请先调用makeBoard方法");
            return;
        }

        int rows = arrTmp.GetLength(0); // 获取二维数组的行数
        int cols = arrTmp.GetLength(1); // 获取二维数组的列数

        // 逐行遍历拼接,用StringBuilder避免频繁字符串拼接的性能损耗
        for(int i=0; i<rows; i++)
        {
            StringBuilder rowContent = new StringBuilder();
            rowContent.Append($"第{i+1}行:");
            for(int j=0; j<cols; j++)
            {
                rowContent.Append(arrTmp[i,j] + "\t");
            }
            Debug.Log(rowContent.ToString());
        }

        // 如果不想逐行输出,也可以拼成一个大字符串一次性打印
        // StringBuilder fullContent = new StringBuilder("ScoreBoard数组内容:\n");
        // for(int i=0; i<rows; i++)
        // {
        //     for(int j=0; j<cols; j++)
        //     {
        //         fullContent.Append(arrTmp[i,j] + "\t");
        //     }
        //     fullContent.Append("\n");
        // }
        // Debug.Log(fullContent.ToString());
    }
}

第二步:修正主类代码的问题

// 实例化对象必须加new关键字
ScoreBoard sb = new ScoreBoard();
// 去掉字符串里的多余空格,或者保持原格式但在makeBoard里处理
string history = "s,o,m,e,s,t,r,i,n,g";

private void Start()
{
    sb.makeBoard(history);
    // 调用输出方法打印数组
    sb.PrintScoreBoardArray();
}

关键知识点说明

  1. 数组生命周期问题:你原来的arrTmp是makeBoard方法里的局部变量,方法执行完就会被销毁,所以必须改成类的字段才能在外部访问输出。
  2. 二维数组遍历:用GetLength(0)获取行数、GetLength(1)获取列数,嵌套循环就能遍历所有元素。
  3. 字符串处理:你的history里有空格,必须用Trim()或调整分割规则,否则会导致字符索引访问出错。
  4. 封装性建议:把输出逻辑放在类内部的方法里,比直接把数组改成public更符合面向对象的封装原则。

内容的提问来源于stack exchange,提问作者Ginxxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:59:40