现在我正在做:
false
但是为每个组件多次添加&&来创建一个可以获取组件数组的方法,如果游戏对象包含它们,它将返回true。
if (gameObj.GetComponent<MeshRenderer>() == true
&& gameObj.GetComponent<BoxCollider>() == true)
fontColor = meshRendererColor;
答案 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;
}