Unity3D: ошибка при подсчете детей с тегом определенного GameObject - PullRequest
0 голосов
/ 28 августа 2018

Unity3D 2018.2.5

У меня есть GameObject с именем "MainObject", в котором есть несколько других GameObject'ов, которые называются SideObjects, с тегами "High" и "Low". Поскольку в MainObject есть несколько разных GameObjects, я пытаюсь их подсчитать.

Я пытаюсь подсчитать, сколько GameObjects находится в «MainObject» с тегом «High».

Это код, который я до сих пор пытался получить тег от детей родительского GameObject, но я получаю ошибку.

Ошибка:

ArgumentException: GetComponent требует, чтобы запрошенный компонент 'List 1' derives from MonoBehaviour or Component or is an interface. UnityEngine.GameObject.GetComponentInChildren[List 1] (Boolean includeInactive) (в C: /buildslave/unity/build/Runtime/Export/GameObject.bindings.cs: 70)

Код у меня есть:

public void getListOfObjectsInMain()
{
    // Reset count before counting
    objCountInMain = 0;

    //  Count amount of children in camera transform
    GameObject currentMain = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<HandleCamera>().targetToLookAt.gameObject;

     // Debug.Log(currentMain);

    List<GameObject> allObjectsInMain = currentMain.GetComponentInChildren<List<GameObject>>(false);

    foreach (GameObject obj in allObjectsInMain)
    {
        if (obj.gameObject.tag == "High")
        {
            objCountInMain++;
        }
    }

    //  Text
    objInMainText.text = objCountInMain.ToString();
}

1 Ответ

0 голосов
/ 28 августа 2018

Несколько выпусков:

1 . GameObject[] allObjectsInMain = currentMain.GetComponentInChildren

Функция GetComponentInChildren используется для получения одного компонента из GameObject. Попытка заставить его вернуть массив или несколько объектов вызовет исключение.

2 . currentMain.GetComponentInChildren<List<GameObject>>(false);

Вы не можете передать GameObject в функцию GetComponentInChildren, потому что GameObject отличается от компонента. Компоненты присоединяются к GameObjects, а функции GetComponentXXX возвращают только компоненты, а не GameObject. Отсюда ключевое слово компонента в нем.

Также вы не можете передать ему List. Единственное, что нужно передать этой функции - это компонент или сценарий, который наследуется от MonoBehaviour, interface или любого встроенного компонента, такого как Rigidbody.


Используйте функцию GetComponentsInChildren с s. Это возвращает несколько объектов. Также передайте ему Transform, так как Transform является компонентом, и каждый GameObject в сцене имеет компонент Transform, его можно использовать для поиска всех дочерних объектов.

int CountChildObjectsByTag(GameObject parent, string tag)
{
    int childCount = 0;
    Transform[] ts = parent.GetComponentsInChildren<Transform>();
    foreach (Transform child in ts)
    {
        if (child != parent.transform && child.CompareTag(tag))
            childCount++;
    }
    return childCount;
}

Еще лучше, просто перебрать transform. Теперь вам не нужно использовать GetComponentsInChildren или возвращать массив каждый раз, когда вызывается эта функция.

int CountChildObjectsByTag(GameObject parent, string tag)
{
    int childCount = 0;
    foreach (Transform child in parent.transform)
    {
        if (child.CompareTag(tag))
            childCount++;
    }
    return childCount;
}

Использование:

GameObject currentMain = GameObject.FindGameObjectWithTag("MainCamera");
int childCount = CountChildObjectsByTag(currentMain, "High");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...