Как я могу заставить все игровые объекты проверить, какие игровые объекты имеют коллайдеры и какие коллайдеры и какие игровые объекты вообще не имеют коллайдеров? - PullRequest
0 голосов
/ 18 октября 2019
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class GetComponents : MonoBehaviour
{
    public List<Collider> allColliders = new List<Collider>();

    private List<GameObject> allObjects = new List<GameObject>();

    // Start is called before the first frame update
    void Start()
    {
        allObjects = FindObjectsOfType<GameObject>().ToList();

        foreach (GameObject go in allObjects)
        {
            foreach (Collider collider in go.transform.GetComponents<Collider>())
            {
                allColliders.Add(collider);
            }
        }
    }

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

    }
}

В конце я хочу иметь два списка, может быть, записать их в текстовый файл, например, в формате вывода:

Wall1 - BoxCollider, CapsuleCollider

Door22 - НетКоллайдеры

Door10 - BoxCollider

Как то так. Цель состоит в том, чтобы выяснить, какие игровые объекты имеют коллайдеры, какие коллайдеры и какие игровые объекты вообще не имеют коллайдеров.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Самый простой способ - получить весь коллайдер на объекте, а затем проверить длину возвращаемого массива, если он равен 0, то коллайдеров нет, в противном случае есть:

void Start()
{
    allObjects = FindObjectsOfType<GameObject>().ToList();

    foreach (GameObject go in allObjects)
    {
        var colliders = go.transform.GetComponents<Collider>();

        int length = colliders.Length;

        if (length == 0)
        {  
            Debug.Log(string.Format("{0} - No Colliders", go.name));
        }
        else
        {
            //composes a list of the colliders types, this will print what you want e.g. "Wall1 - BoxCollider, MeshCollider"

            string colliderTypes = string.Empty;

            for (int i = 0; i < length; i++)
            {
                colliderTypes = string.Format("{0}{1}", colliderTypes, colliders[i].GetType().Name);

                if (i != (length - 1))
                {
                    colliderTypes = string.Format("{0}, ", colliderTypes);
                }
            }
            Debug.Log(string.Format("{0} - {1}", go.name, colliderTypes));
        }
    }
}

Обратите внимание, чтокласс Collider является основой для 3D-коллайдеров, если вам также необходимо проверить наличие 2D-моделей, тогда получите все Collider2D компоненты и сделайте то же самое.

1 голос
/ 18 октября 2019

Используйте GetType для сравнения коллайдеров с каждым подклассом коллайдера:

foreach (GameObject go in allObjects)
{
    print (go + " has:");
    foreach (Collider collider in go.transform.GetComponents<Collider>())
    {
        if(collider.GetType() == typeof(MeshCollider)) print("mesh");
        else if(collider.GetType() == typeof(BoxCollider)) print("box");
        else if(collider.GetType() == typeof(CapsuleCollider)) print("capsule");
        else if(collider.GetType() == typeof(SphereCollider)) print("sphere");
        else print("other");
    }
}

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

Вместо печати вы можете добавить новый ключ в словарь с пустым списком, а затем добавить к этому списку во внутреннем foreach.

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