【问题标题】:How can I get all gameobjects to check what gameobjects have colliders and what colliders and what gameobjects dont have colliders at all?如何让所有游戏对象检查哪些游戏对象有碰撞器,哪些游戏对象根本没有碰撞器?
【发布时间】:2019-10-18 20:30:41
【问题描述】:
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

类似的东西。目标是找出哪些游戏对象有碰撞器、哪些碰撞器以及哪些游戏对象根本没有碰撞器。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    最简单的方法是获取对象上的所有碰撞器,然后检查返回数组的长度,如果为 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 组件并执行相同的操作。

    【讨论】:

      【解决方案2】:

      使用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 中附加到该列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 2023-03-11
        • 2019-08-03
        • 2016-02-24
        相关资源
        最近更新 更多