Как получить GameObjects с разными тегами в одном массиве |Unity3D - PullRequest
1 голос
/ 30 сентября 2019

У меня есть 2 GameObjects: 1.) Винты (с 2 пустыми дочерними объектами с прикрепленным скриптом для порождения различных сборных типов винтов) 2.) Plate

Объекту Plate мне назначен скрипт, которыйполучает определенные теги и помещает эти объекты с этим тегом в массив. Однако я добавил метод для добавления двух разных типов тегов в список, а затем в один массив (винты), как показано ниже.

Создание экземпляров винтов происходит внутри другого метода сценариев Awake (). Оба вида винтов создаются x20, поэтому их всего 40.

Попытка получить все объекты с одним тегом работает нормально.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class ScrewHandler : MonoBehaviour
{
    /*------------- Declaration of vars etc. -------------*/

    public GameObject[] Screws;

    /*----------------- Create Array --------------------------*/
    private void Start()
    {
        Debug.Log("Start called");

        Screws = FindGameObjectsWithTags(new string[] {"ScrewA","ScrewB"});

        // custom method to get multiple types of tags into one array
        GameObject[] FindGameObjectsWithTags(params string[] tags)
        {
            var all = new List<GameObject>();

            foreach(string tag in tags)
            {
                var temp = GameObject.FindGameObjectsWithTag(tag).ToList();
            }
            return all.ToArray();
        }

    }

}

Если все работает, я долженвозможность видеть массив со всеми объектами в инспекторе скрипта.

1 Ответ

1 голос
/ 30 сентября 2019

Ваш пользовательский метод FindGameObjectsWithTags будет возвращать пустой массив при каждом его запуске.

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

Я предложу вам сделать следующее:

GameObject[] FindGameObjectsWithTags(params string[] tags)
{
    var all = new List<GameObject>();

    foreach (string tag in tags)
    {
        all.AddRange(GameObject.FindGameObjectsWithTag(tag).ToList());
    }

    return all.ToArray();
}

РЕДАКТИРОВАНИЕ: Опечатка

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