调整精灵大小导致空引用异常

Resizing sprite causes null reference exceptions

我正在构建一个具有 10x13 瓷砖网格的扫雷游戏(图 1)。 在 Inspector 中,每个图块都已定位在 X 和 Y 轴上(0 到 9 和 0 到 12)。

我想调整这些图块的大小(图 2),但是如果我进行任何更改,我会在项目加载时收到以下错误。 IndexOutOfRangeException:索引超出数组范围。

当我点击任何图块时,出现以下错误。 NullReferenceException: 对象引用未设置到对象的实例

此异常与下面写在 void Start 上的代码片段有关

IndexOutOfRangeException:索引超出数组范围。

 // Register in Grid
         int x = (int)transform.position.x;
        int y = (int)transform.position.y;
        Playfield.elements[x, y] = this;

虽然此异常与以下内容有关 class。

NullReferenceException: 对象引用未设置到对象的实例

    public class Playfield
{
    // The Grid itself
    public static int w = 10; // this is the width
    public static int h = 13; // this is the height
    public static Element[,] elements = new Element[w, h];

// Uncover all Mines
public static void uncoverMines()
{
    foreach (Element elem in elements)
        if (elem.mine) elem.loadTexture(0);
}

有时瓷砖工作有时不工作。 有其他设置方法吗?

你确定是javascript吗?看起来像 C#:)

问题在您提供的屏幕截图中可见。

您将 xy 从游戏对象的位置投射到 int 并将它们用作数组的索引。但是现在,请看第二个屏幕截图 - 在 positioning/scaling 之后,您在 (-1.194, -0.635) 处有元素。当这些值被强制转换为 int 时,您会得到 -10。猜猜当尝试使用这些值访问数组时会发生什么? IndexOutOfRangeException.

正如我们已经证明的那样,场景中的位置不再对应于您的数组索引,因此数组中的某些元素很可能根本没有被初始化。当迭代 elements 并尝试从 null 元素访问数据时,它抛出 NullReferenceException.

如何解决?你不应该依赖于场景位置来注册你的元素。我会反转逻辑:为元素对象创建一个预制件和一个脚本,用从这个预制件实例化的对象填充板。在那里定义您的数组,并在实例化时将每个元素添加到其中。当然,您需要定义其他属性,例如元素偏移量和起始位置,才能正确显示所有内容。但它也可以让您灵活地简单地自定义电路板尺寸。