Как я могу проверить, содержит ли GameObject сетчатый рендеринг, но не содержит ли коллайдер, а затем добавить к нему коллайдер? - PullRequest
2 голосов
/ 10 мая 2019
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AddColliders : MonoBehaviour
{
    public List<GameObject> objectsToAddCollider = new List<GameObject>();

    // Start is called before the first frame update
    void Start()
    {
        AddDescendantsWithTag(transform, objectsToAddCollider);
    }

    // Update is called once per frame
    void Update()
    {

    }

    private void AddDescendantsWithTag(Transform parent, List<GameObject> list)
    {
        foreach (Transform child in parent)
        {
            if (child.gameObject.GetComponent<MeshRenderer>() != null
                && child.gameObject.GetComponent<)
            {
                list.Add(child.gameObject);
            }
            AddDescendantsWithTag(child, list);
        }
    }
}

В этой строке я проверяю, есть ли рендерер сетки, прикрепленный к игровому объекту, но как мне проверить, не привязан ли он к какому-либо типу коллайдера? А как добавить к нему коллайдер из сетки?

Это то, что я пробовал до сих пор:

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

public class AddColliders : MonoBehaviour
{
    public List<GameObject> objectsToAddCollider = new List<GameObject>();

    // Start is called before the first frame update
    void Start()
    {
        AddDescendantsWithTag(transform, objectsToAddCollider);
    }

    // Update is called once per frame
    void Update()
    {

    }

    private void AddDescendantsWithTag(Transform parent, List<GameObject> list)
    {
        foreach (Transform child in parent)
        {
            if (child.gameObject.GetComponent<MeshRenderer>() != null
                && child.gameObject.GetComponent<Collider>() == null)
            {
                child.gameObject.AddComponent<MeshCollider>();
                list.Add(child.gameObject);
            }
            AddDescendantsWithTag(child, list);
        }
    }
}

Но потом в конце добавляем точку останова на строку:

AddDescendantsWithTag(transform, objectsToAddCollider);

Я вижу, что игровые объекты в Списке объектов ToAddCollider в Коллайдере это сообщение:

collider = System.NotSupportedException: свойство collider устарело

Collider

Ответы [ 2 ]

4 голосов
/ 10 мая 2019

GameObject.collider устарело и удалено в версии 2019.1.0.

Вы больше не можете использовать его для отладки.


Чтобы проверить, существует ли Collider любого типа, используйте

var collider = child.GetComponent<Collider>();

чтобы просто проверить, существует ли он, вы также можете сделать

if(child.GetComponent<Collider>())
{
    Debug.Log("Collider found");
}

снова, поскольку Collider (или, точнее, типа Unity Object, от которого он наследуется) реализует неявный bool оператор , равный != null.


Очень хороший способ добавить компонент, если он не существует в одной строке:

Collider collider = child.GetComponent<Collider>() ? collider : child.gameObject.AddComponent<Collider>();

или даже немного короче

Collider collider = child.GetComponent<Collider>() ?? child.gameObject.AddComponent<Collider>();

Примечание: напечатано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идея проясняется.

1 голос
/ 10 мая 2019

Вы можете использовать Коллайдер, так как он является базовым классом для всех коллайдеров.

    private void AddDescendantsWithTag(Transform parent, List<GameObject> list)
{
    foreach (Transform child in parent)
    {
        if (child.gameObject.GetComponent<MeshRenderer>() != null
            && child.gameObject.GetComponent<Collider>()) // You can modify this line according to your requirement. 
        {
            list.Add(child.gameObject);
        }
        AddDescendantsWithTag(child, list);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...