Unity获取父或子物体对象

2,219 阅读5分钟

GameObject公共函数:

1、GameObject.GetComponent

如果游戏对象附加了类型为 type 的组件,则将其返回,否则返回 null。

使用 gameObject.GetComponent 将返回找到的第一个组件,并且未定义顺序。如果预期存在多个相同类型的组件,请改用 gameObject.GetComponents,并针对某些唯一的属性循环使用返回的组件测试。

go的Active,组件的enable,go的activeInHierarchy 的状态均不影响查找

public GameObject go;
var g = go.GetComponent<Button>();//通用版本
var g = go.GetComponent(typeof(Transform))as Transform;

2、GameObject.GetComponentInChildren

使用深度首次搜索返回 GameObject 或其任何子项中类型为 type 的组件。第一个会返回父物体

仅当在活动 GameObject 上发现组件时才返回该组件。

go的Active,组件的enable,go的activeInHierarchy 的状态均不影响查找

var g = go.GetComponentInChildren<Transform>();//返回包括自身的第一个对象
//组件或物体的激活状态不影响其寻找

3、GameObject.GetComponentsInChildren

返回 GameObject 或其任何子项中类型为 type 的所有组件。返回父物体及其子物体

Unity 以递归方式在子 GameObject 上搜索组件。这意味着,它还包含目标 GameObject 的子 GameObject 以及所有后续子 GameObject。注意:如果请求的类型是 MonoBehaviour 的衍生并且无法加载关联的脚本,此函数将为该组件返回“null”。

子物体的第一个状态Active为false时,就不会继续往下获取,第一个Active为false的物体也不会被找到。寻找子物体的父物体go.Active为false时,返回父类及其所有Active为true的子类;go.Active不为false时,从父往子遍历,收集所有activeInHierarchy为true的父和子。组件的enable不影响查找。

go.GetComponentsInChildren<Transform>().ToList().ForEach(x=>Debug.Log(x));

4、GameObject.GetComponentInParent

返回 GameObject 或其任何父项中类型为 type 的所有组件。返回自身或自身的父对象。

自身Active为true时返回自身,自身Active为false时自身往上父物体遍历,返回第一个Active为true的父对象。组件的激活状态不影响父类查找。

组件搜索是在父对象上以递归方式执行的,因此包含父项的父项,依此类推。注意:如果请求的类型是 MonoBehaviour 的衍生并且无法加载关联的脚本,此函数将为该组件返回“null”。

从自身往父遍历,自身activeInHierarchy为true时返回自身,为false时返回activeInHierarchy为true的第一个父类,组件的enable不影响查找。

var g = go.GetComponentInParent<BoxCollider>();

5、GameObject.GetComponentsInParent

返回 GameObject 或其任何父项中类型为 type 的所有组件。

组件搜索是在父对象上以递归方式执行的,因此包含父项的父项,依此类推。注意:如果请求的类型是 MonoBehaviour 的衍生并且无法加载关联的脚本,此函数将为该组件返回“null”。

从自身往父遍历,自身activeInHierarchy为true时返回包括自身及其所有父类,为false时返回activeInHierarchy为true的所有父类,组件的enable不影响查找。

go.GetComponentsInParent<BoxCollider>().ToList().ForEach(x=>Debug.Log(x));

静态函数:

6、GameObject.Find

name 查找 GameObject,然后返回它。

此函数仅返回活动 GameObject。如果未找到具有 name 的 GameObject,则返回 null。如果 name 包含“/”字符,则会向路径名称那样遍历此层级视图。

出于性能原因,建议不要每帧都使用此函数,而是在启动时将结果缓存到成员变量中,或者使用 GameObject.FindWithTag

**注意:**如果您要查找子 GameObject,使用 Transform.Find 通常会更加轻松。

**注意:**如果正在使用多个场景运行此游戏,则 Find 将在所有这些场景中进行搜索。

var g = GameObject.Find("Player");//返回activeInHierarchy为true的对象
var g = GameObject.Find("/Cube");//Cube在层次结构视图中不能有父级。
var g = GameObject.Find("Cube/Player/Player/Player/Player");//遍历层级视图
var g = GameObject.Find("/Cube/Player/Player/Player/Player");//遍历层级视图

7、GameObject.FindWithTag

返回一个标记为 tag 的活动 GameObject。如果未找到 GameObject,则返回 null

在使用标签之前,必须先在标签管理器中声明标签。如果标签不存在,或将空字符串或 null 作为标签传递,将抛出 UnityException

**注意:**此方法返回它找到的具有指定标签的第一个 GameObject。如果一个场景包含多个具有指定标签的活动 GameObjects,则无法保证此方法返回特定 GameObject。

返回activeInHierarchy为true的对象。

var g = GameObject.FindWithTag("Player");

8、GameObject.FindGameObjectsWithTag

返回标签为 tag 的活动 GameObjects 的数组。如果未找到任何 GameObject,则返回空数组。

返回activeInHierarchy为true的所有对象。

var g = GameObject.FindGameObjectsWithTag("Player");

Transform公共函数

1、Transform.Find

n 查找子项,然后返回它。返回activeInHierarchy为true的对象。

如果未找到具有 n 的子项,则返回 null。 如果 n 包含“/”字符,它将像访问路径名称那样访问层级视图中的变换。

__注意:__.Find 不在变换层级视图中执行递归向下查找。

public Transform go;
var g = go.Find("Player");//返回activeInHierarchy为true的对象
var g = go.Find("/Cube");//Cube在层次结构视图中不能有父级。
var g = go.Find("Cube/Player/Player/Player/Player");//遍历层级视图
var g = go.Find("/Cube/Player/Player/Player/Player");//遍历层级视图

2、Transform.GetChild

按索引返回变换子项。

如果该变换没有子项,或者 index 参数的值大于子项数,则会生成错误。在这种情况下,将给出“Transform child out of bounds”错误。子项数可以由 childCount 提供。

go的Active,go的activeInHierarchy ,孩子的Active,activeInHierarchy 的状态均不影响查找孩子

var g = go.GetChild(0);//返回第一个孩子

3、Transform.SetParent

public Transform go;
public Transform g;
go.SetParent(g);//g是go的父类