Как я могу создать метод, чтобы проверить, содержит ли gameobject определенный компонент (ы)? - PullRequest
0 голосов
/ 30 октября 2018

Сейчас я занимаюсь:

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

Но вместо этого добавляем && много раз для каждого компонента, чтобы создать метод, в котором вы можете получить массив компонентов, и он вернет true, если игровой объект содержит их.

private static bool IsContainComponents(string[] components, GameObject gameObj)
{
    bool contain = false;

    return contain;
}

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Поскольку вы хотите использовать для этого строку, используйте Type.GetType для преобразования имени компонента, являющегося строкой, в Type, затем используйте перегрузку GetComponent, которая принимает Type в качестве аргумента. Если компонент имеет значение false, просто верните 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;
}
0 голосов
/ 30 октября 2018

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

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