Unity的transform中有一个GetComponentsInChildren方法,可以获取到GameObject下所有子物体上需要查找的组件,但是不知道为什么在编辑器下获取不到。
在Unity编辑器模式下,用一个Object接收物体,OnGUI()中添加
obj = EditorGUILayout.ObjectField("需要查看的预制", obj, typeof(Object), false);代码。
然后在Unity中拖拽prefab到编辑器窗口中。把obj转换成GameObject后,使用如下代码查找子物体上的组件,
_gameObject.transform.GetComponentsInChildren<Transform>();
结果组件找不到,并且发现GameObject下的GetComponentInParent也查找不到,其他的没有一一验证。(之前使用这个API的时候是用的Unity4.7.2,今天使用Unity5.6没有这个问题,如果遇到这个问题,在方法里面添加一个TRUE参数即可。如
_gameObject.transform.GetComponentsInChildren<Transform>(true);
--2018.05.02)
所以先写一个方法在编辑器模式下获取子物体的组件。代码如下:
/// <summary>
/// 获取子物体的某个组件
/// </summary>
/// <typeparam name="T">组件泛型</typeparam>
/// <param name="obj">父物体</param>
/// <returns></returns>
private T[] GetComponentsInChildren<T>(GameObject obj) where T : Component
{
if (obj == null)
return null;
Transform _tran = obj.transform;
List<T> _listT = new List<T>();
for (int i = 0; i < _tran.childCount; i++)
{
T _t = _tran.GetChild(i).GetComponent<T>();
if (_t != null)
{
_listT.Add(_t);
}
if (_tran.childCount > 0)
{
T[] _childrenT = GetComponentsInChildren<T>(_tran.GetChild(i).gameObject);
for (int j = 0; j < _childrenT.Length; j++)
{
_listT.Add(_childrenT[j]);
}
}
}
return _listT.ToArray();
}