Поскольку вы хотите использовать для этого строку, используйте 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;
}