首页 > 解决方案 > 如何检查 GameObject 是否包含网格渲染器但不包含任何碰撞器,然后向其添加碰撞器?

问题描述

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);

我在 Collider 中看到 List objectsToAddCollider 中的游戏对象这条消息:

collider = System.NotSupportedException: collider 属性已被弃用

对撞机

标签: c#unity3d

解决方案


GameObject.collider在 2019.1.0 版本中已弃用并删除。

你不能再用它来调试了。


检查是否有Collider任何类型的使用

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

简单地检查它是否存在你也可以做

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

再次因为(或者更好地说它继承自ColliderUnity 的类型)实现了一个隐式运算符equals 。Objectbool!= null


因此,如果组件不存在于单行中,则添加组件的一种非常好的方法是

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

甚至略短

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

注意:在智能手机上打字,所以没有保修,但我希望这个想法很清楚。


推荐阅读