如何创建一种方法来检查游戏对象是否包含特定组件?

时间:2018-10-29 23:19:10

标签: c# unity3d

现在我正在做:

false

但是为每个组件多次添加&&来创建一个可以获取组件数组的方法,如果游戏对象包含它们,它将返回true。

if (gameObj.GetComponent<MeshRenderer>() == true
    && gameObj.GetComponent<BoxCollider>() == true)
    fontColor = meshRendererColor;

2 个答案:

答案 0 :(得分:4)

GetComponent的重载为System.Type

所以您的方法可能是:

public static bool HasAllComponents(GameObject gameObject, params System.Type[] types)
{
    for (int i = 0; i < types.Length; i++)
    {
        if (gameObject.GetComponent(types[i]) == null)
            return false;
    }

    return true;
}

请注意params关键字,该关键字使您无需手动创建数组即可调用该方法:HasAllComponents(gameObject, typeof(MeshRenderer), typeof(BoxCollider), etc);

答案 1 :(得分:3)

由于要为此使用字符串,请使用Type.GetType将作为字符串的组件的名称转换为Type,然后使用以类型为参数的GetComponent重载。如果该组件为假,则只需返回false

private static bool IsContainComponents(string[] components, GameObject gameObj)
{
    foreach (var cp in components)
    {
        //Convert the component to Type
        Type type = Type.GetType(cp);
        //Get component with this component
        Component component = gameObj.GetComponent(type);
        //If it is null exit the loop then return false
        if (component == null)
            return false;
    }
    return true;
}

这应该与您自己的组件一起使用。如果使用内置的Unity组件,则必须使用名称空间UnityEngine作为前缀,然后是组件名称,后跟逗号和名称空间。

例如,如果您要寻找内置组件Rigidbody,则为"UnityEngine.Rigidbody, UnityEngine" 不是 "Rigidbody"

Debug.Log(IsContainComponents(new string[] {"UnityEngine.Rigidbody, UnityEngine" }, gameObject));

您也可以只使用Component而不是string来解决此问题。

private static bool IsContainComponents(Component[] components, GameObject gameObj)
{
    foreach (var cp in components)
    {
        //Get component with this component
        Component component = gameObj.GetComponent(cp.GetType().Name);
        //If it is null exit the loop then return false
        if (component == null)
            return false;
    }
    return true;
}