В Unity пытается получить координаты Vector3 из массива и установить их в новую переменную.Какой правильный синтаксис? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть список всех появившихся объектов в игре. Я пытаюсь выполнить поиск в этом списке, чтобы найти только объекты, помеченные как «Дорожный тег», получить их положение преобразования и преобразовать его в новую переменную.

Если я использую

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, в котором он печатает координаты, как я хочу.

Ответы [ 4 ]

2 голосов
/ 29 марта 2019

Вы должны инициализировать массив roadCoordinates, иначе вы получите ошибку NullReferenceException.Кроме этого ваша логика в порядке.Вы можете решить эту проблему, добавив эту строку после присваивания loopCount:

roadCoordinates = new Vector3[loopCount];

Что происходит, когда вы не инициализируете свой массив, вы создаете переменную с именем roadCoordinates, но естьнет памяти, выделенной или указанной для этой переменной.Следовательно, он не указывает на что-либо в памяти, и когда вы пытаетесь использовать его, он говорит, что не может сослаться на какой-либо блок памяти.

Как вы упомянули в своем вопросе, у вас есть список всех порожденныхЕсли вы можете сохранить эти точки в списке, вам не нужно выделять память, вы можете просто добавить элементы в список.

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

Затем вы можете добавлять элементы, используяroadCoordinates.Add(spawnedObjects[i].transform.position)

Если вам нужно сохранить индексы порожденного объекта, который имеет Road Tag, вы можете использовать Dictionary

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

Тогда вы можетедобавить элементы, такие как roadCoordinates.Add(i,spawnedObject[i].transform.position)

0 голосов
/ 29 марта 2019

Да, как предполагает Александр, использование списков - это путь. Вам не нужно использовать словарь, так как вы уже знаете, что список roadCoordinates будет содержать только элементы тега 'Road Tag'.

public static List<Vector3> roadCoordinates = new List<Vector3>();

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

    for (int i = 0; i < loopCount; i++)
    {
        if (spawnedObjects[i].tag == "Road Tag")
        {
            roadCoordinates.Add(new Vector3(spawnedObjects[i].transform.position.x, spawnedObjects[i].transform.position.y, spawnedObjects[i].transform.position.z));
        }

    }
}
0 голосов
/ 29 марта 2019

Использование списков лучше в этом случае, потому что мы не знаем с самого начала, сколько объектов у нас будет.

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

...

roadCoordinates.Add(new Vector3(...));

Здесь - учебник о списках.

0 голосов
/ 29 марта 2019

Вы, вероятно, должны использовать array.push () (см .: https://docs.unity3d.com/ScriptReference/Array.Push.html) вместо записи 'roadCoordinates [i]', поскольку этот массив все еще пуст. Используя 'push', вы добавляете новую позицию /Трехмерный вектор до конца массива, который также работает, если массив все еще пуст. Надеюсь, это поможет вам!

PS: если вы сначала инициализируете массив определенной длины, как это предлагаетсядругой ответ, у вас будет много пустых элементов массива, поскольку не каждый элемент в вашем цикле является «дорожным тегом».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...