首页 > 解决方案 > 在 Unity 中,尝试从数组中获取 Vector3 坐标并将它们设置为新变量。什么是正确的语法?

问题描述

我有一个游戏中所有生成对象的列表。我正在尝试搜索该列表以仅查找标记为“Road Tag”的对象,获取它们的变换位置,并将其转换为新变量。

如果我使用

Debug.Log(spawnedObjects[i].transform.position;

它实际上可以很好地打印出 x、y、z 坐标。但我不知道如何将它们分配给新的 Vector3 变量。数组的语法似乎不同。

我努力了:

roadCoordinates[i] = new Vector3(spawnedObjects[i].transform.position.x, spawnedObjects[i].transform.position.y, spawnedObjects[i].transform.position.z);

roadCoordinates[i] = spawnedObjects[i].transform.position;

public static Vector3[] roadCoordinates;    


public static void FindSpawnedRoads()
{
    loopCount = spawnedObjects.Count;

    for (int i = 0; i < loopCount; i++)
    {
        if (spawnedObjects[i].tag == "Road Tag")
        {
            //This prints perfectly
            Debug.Log(spawnedObjects[i].transform.position);


            //This gives me NullReferenceException
            roadCoordinates[i] = new Vector3(spawnedObjects[i].transform.position.x, spawnedObjects[i].transform.position.y, spawnedObjects[i].transform.position.z);

            Debug.Log(roadCoordinates[i]);
        }

    }
}

我希望将变量设置为的 Vector3 坐标roadCoordinates[i]

我反而得到NullReferenceException. 除非我打印SpawnedObjects它打印我想要的坐标。

标签: c#arraysunity3dtransform

解决方案


您必须初始化roadCoordinates数组,否则您会收到NullReferenceException错误消息。除此之外,你的逻辑没问题。loopCount您可以通过在分配后添加此行来解决此问题:

roadCoordinates = new Vector3[loopCount];

当您不初始化数组时会发生什么,您创建了一个名为roadCoordinates但没有为此变量分配或引用的内存的变量。因此,它不指向内存中的任何内容,当您尝试使用它时,它说我无法引用任何内存块。

正如您在问题中提到的,您有一个所有生成对象的列表,您也可以将这些点存储在一个列表中,然后您不必分配任何内存,您只需将元素添加到列表中即可。

List<Vector3> roadCoordinates = new List<Vector3>()

然后你可以使用添加元素roadCoordinates.Add(spawnedObjects[i].transform.position)

如果您需要存储具有 a 的衍生对象的索引,Road Tag您可以使用 aDictionary

Dictionary<int, Vector3> roadCoordinates = new Dictionary<int, Vector3>()

然后你可以添加像roadCoordinates.Add(i,spawnedObject[i].transform.position)


推荐阅读