【问题标题】:Length of array always zero in C# UnityC# Unity 中数组的长度始终为零
【发布时间】:2014-02-22 16:56:23
【问题描述】:

我正在尝试使用统一游戏引擎创建一个基本的井字游戏。这是我的代码:

public int[] board = new int[9] {
    0, 0, 0, 
    0, 0, 0, 
    0, 0, 0
};
public bool xTurn = true;

public void OnGUI() {
    float width = 75;
    float height = 75;
    for (int y = 0; y < 3; y++) {
        Debug.Log("Value of y = " + y);
        for (int x = 0; x < 3; x++) {
            Debug.Log("Length of array = " + board.Length);
            int boardIndex = (y * 3) + x;
            Rect square = new Rect(x * width, y * height, width, height);
            Debug.Log ("Value of boardIndex = " + boardIndex + " value of x = " + x);
            string owner = board[boardIndex] == 1 ? "X" :
                board[boardIndex] == -1 ? "O" : "";
            if(GUI.Button(square, owner))
                SetControl(boardIndex);
        }
    }
}

但问题是 board 数组的长度始终为 0,并且在尝试访问 board 数组中的任何值时会出现 ArrayIndexOutOfBounds 异常。 我什至尝试过不同的方法来创建数组。还是一样的结果。谁能告诉我数组长度为 0 的原因。

【问题讨论】:

  • 也许您填充数组的代码没有运行?确保代码在一个可以运行的方法中(用断点验证),一旦你确定代码被命中,你应该很好。
  • 相信你可以用 public int[] board = { x, x, x };也许尝试以不同的方式初始化它
  • @RyPope:初始化对我来说看起来不错。否则他会得到一个编译错误。
  • @RyPope 两种语法都应该工作。
  • 有些东西你没有显示。事实上,board 不可能是 0 长度。

标签: c# arrays unity3d


【解决方案1】:

我之前在公共领域使用 Unity 遇到过这种情况。我推测这是由于编辑器界面如何与公共字段集成(编辑器正在清除您的初始化值),但我无法找到支持它的文档。但是,我可以通过将初始化代码移到 Start 函数中来解决这个问题。

但是,如果您仍希望在编辑器中显示它,您可能需要添加额外的逻辑。

void Start ()
{
    board = board ?? new int[9] {
      0, 0, 0, 
      0, 0, 0, 
      0, 0, 0
    };
}

或者,我认为,如果您只是将变量更改为 privateprotected,则应该将其从编辑器中删除,它也应该可以工作。

【讨论】:

  • 我记得 Unity 要求你将几乎所有的初始化都放在 MonoBehaviors 的 Start 方法中,因为构造函数不用于实例化行为。
  • @omerjerk 如果您不需要将board 暴露给编辑器,您只需将其设为private
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2012-09-06
相关资源
最近更新 更多