Unity3D 2018.2.5
我有一个名为“ MainObject”的GameObject,它下面还有其他几个GameObjects作为名为SideObjects的子级,并带有标签“ High”和“ Low”。由于MainObject中有几个不同的GameObject,因此我试图对它们进行计数。
我试图计算标记为“ High”的“ MainObject”中有多少个GameObject。
到目前为止,这是我尝试从父GameObject的子代获取标签的代码,但出现错误。
错误:
ArgumentException:GetComponent要求所请求的组件'List
1' derives from MonoBehaviour or Component or is an interface. UnityEngine.GameObject.GetComponentInChildren[List
1](布尔值includeInactive)(在C:/buildslave/unity/build/Runtime/Export/GameObject.bindings.cs:70)
我有验证码:
public void getListOfObjectsInMain()
{
// Reset count before counting
objCountInMain = 0;
// Count amount of children in camera transform
GameObject currentMain = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<HandleCamera>().targetToLookAt.gameObject;
// Debug.Log(currentMain);
List<GameObject> allObjectsInMain = currentMain.GetComponentInChildren<List<GameObject>>(false);
foreach (GameObject obj in allObjectsInMain)
{
if (obj.gameObject.tag == "High")
{
objCountInMain++;
}
}
// Text
objInMainText.text = objCountInMain.ToString();
}
答案 0 :(得分:2)
少数问题:
1 。GameObject[] allObjectsInMain = currentMain.GetComponentInChildren
GetComponentInChildren
函数用于从GameObject中获取一个组件。试图使其返回一个数组或多个对象将引发异常。
2 。currentMain.GetComponentInChildren<List<GameObject>>(false);
您不能将GameObject
传递给GetComponentInChildren
函数,因为GameObject与组件并不相同。组件被附加到GameObjects,而GetComponentXXX
函数仅返回Components而不返回GameObject。因此是其中的组件关键字。
您也无法将List
传递给它。传递给此函数的唯一内容是从MonoBehaviour
,interface
或任何内置组件(例如Rigidbody
组件)继承的组件或脚本。
将GetComponentsInChildren
函数与s
一起使用。那将返回多个对象。另外,将Transform
传递给它,因为Transform
是一个组件,并且场景中的每个GameObject都有一个Transform
组件,因此可以用来查找所有子对象。
int CountChildObjectsByTag(GameObject parent, string tag)
{
int childCount = 0;
Transform[] ts = parent.GetComponentsInChildren<Transform>();
foreach (Transform child in ts)
{
if (child != parent.transform && child.CompareTag(tag))
childCount++;
}
return childCount;
}
更好的是,只需遍历transform
。现在,您不必每次调用此函数时都使用GetComponentsInChildren
或返回一个数组。
int CountChildObjectsByTag(GameObject parent, string tag)
{
int childCount = 0;
foreach (Transform child in parent.transform)
{
if (child.CompareTag(tag))
childCount++;
}
return childCount;
}
用法:
GameObject currentMain = GameObject.FindGameObjectWithTag("MainCamera");
int childCount = CountChildObjectsByTag(currentMain, "High");