1.通过对象名称

(1).transform.Find (string name)

通过名字查找子对象并返回它,找不到返回null

  • 注意如果参数中只有对象名称那么仅能查找所有儿子中的对象看是否有相同名称的,而不能查找再后面的后代。
  • 但是如果参数中包含 ‘/’ 字符,将像路径一样穿越层次去查找相应名称的物体。 eg: Transform aFinger = transform.Find("LeftShoulder/Arm/Hand/Finger");
  • 然而很多情况下我们不知道对象层级(比如模型过于复杂或者想灵活控制),我们可以用递归的方式去查找:
private Transform FindChildInTransform(Transform parent,string child)
{
	Transform childTF = parent.Find(child);
	if(childTF != null)
	{
		return childTF;
	}
	for(int i=0;i<parent.childCount;i++)
	{
		childTF=FindChildInTransform(parent.GetChild(i),child);
	}
	return null;
}

(2). transform.GetChild(int index)

通过索引返回一个变换的子对象(仅能找儿子对象), 索引必须小于该变换的Transform.childCount(子物体数量,从0开始计数),上面在递归查找子物体的方法中已经用到。

(3).transform.parent

返回当前对象的父物体,也可通过这个属性修改当前对象所属哪个父物体。

(4).GameObject.Find(string name)

静态方法,直接用类去调用即可,和transform.Find (string name)的区别就是这个方法会从hierarchy面板中所有的对象去遍历查找第一个与参数相同的名称,显然这是一个及其消耗性能的事情,官方都说除非迫不得已,建议不要在每一帧中使用这个函数。
同样这个方法也可以使用路径作为参数。eg:
若无父物体参数写成:hand = GameObject.Find("/Monster/Arm/Hand"); 有的话写成:hand = GameObject.Find("Monster/Arm/Hand");

2.通过tag(标签)查找:

(1).GameObject.FindWithTag(string tag);

静态方法,返回标记为tag的第一个游戏对象,如果没有找到对象则为空。
标签必须在使用之前到标签管理器里面声明。如果标签不存在或为空字符串或传递null作为标签,将抛出Unity异常。

(2).GameObject.FindGameObjectsWithTag(string tag)

静态方法,返回标记为tag的所有激活的游戏对象列表(GameObject[] ),如果没有找到则为空。

标签这种标记方法真是太好了,不仅节约了查找时间,还能让游戏对象有具体的分类标记。

3.通过对象类型/组件查找游戏对象

Object.FindObjectOfType (Type type);

返回Type类型第一个激活的加载的对象。
这个方法同样会遍历所有的游戏对象去找第一个有参数组件的物体。不推荐在每帧使用这个函数。

Object.FindObjectsOfType (Type type);

返回Type类型的所有激活的加载的物体列表( Object[] )。
同样十分消耗性能。。。不推荐在每帧使用这个函数。

获取组件的方式:

GetComponent、GetComponentInChildren、GetComponentInParent、GetComponents、GetComponentsInChildren、GetComponentsInParent
获取到有关对象的组件即可通过相应组件.gameObject属性获得想要的对象/对象列表。