一、应用父子关系
1、通过父子关系获取物体
仔细观察Hierarchy窗口会发现,其实拥有大量“父子关系”的物体已经构成了树形结构。在Unity中,“父子关系”的表达是Transform组件的职责。下表列出了在父子节点之间查找物体的相关方法和属性
Transform组件中与查找物体相关的方法
方法名 | 用途 | 参数和返回值 |
transform.Find | 在“父子关系树”中沿给定的路径查找物体的Transform组件 | 参数:以字符串表示一个路径。与文件路径类似,可以通过给定的路径信息,灵活找到任意其他物体。 返回值:找到物体的Transform组件。如果没找到,返回null。 |
transform.GetChild | 根据子物体的序号查找子物体 | 参数:一个整数,从0开始,表示要查找的子物体的序号。子物体的序号就是它在同一级的所有子物体中排第几个,也是Hierarchy窗口中子物体的顺序。 返回值:返回该子物体,如果下标超出范围则返回null |
transform.GetSiblingIndex | 获得该物体在兄弟节点之间的序号 | 参数:无 返回值:序号。获得本物体在兄弟物体之间的序号 |
transform.IsChildeOf | 判断是否是另一个物体的子物体 | 参数:某个其他物体的Transform组件,不能为null 返回值:如果参数指定的物体是本物体的父物体,则返回true,否则返回false |
Transform组件中与查找物体相关的属性
属性名称 | 含义与详细说明 |
transform.parent | 获取该物体的父物体。 如果对它赋值,可以直接改变本物体的父物体,例如赋值为null代表将本物体放在最高层。 |
transform.root | 沿着本物体的父物体一直向上查找,获取最上一级的父物体 |
transform.childCount | 获取该物体的子物体总数,不包含子物体的子物体。 与transform.GetChild()方法结合使用可以用来遍历所有子物体。 |
2、通过父子路径获取物体
通过路径,可以一次移动很多步。
查找物体的路径与操作系统的文件路径类似。当需要指明下一级节点时,就写出该节点的名称。如果还要继续指明下一级,就加上斜杠“/”分隔。如果要引用上一级节点,使用两个英文句号“..”即可。这样一来,理论上从一个物体出发就可以获取到场景中任意一个节点
3、一些有用的方法
方法 | 用途 | 参数和返回值 |
GetComponentInChildren | 从所有子物体中查找某种组件 | 参数:需要用泛型指定查找的类型 返回值:找到的第一个组件 |
GetComponentsInChildren | 从所有子物体中查找所有某种组件 | 参数:需要用泛型指定查找的类型 返回值:包含所有该类型组件的数组 |
GetComponentInParent | 从父物体中查找某种组件 | 参数:需要用泛型指定查找的类型 返回值:找到的第一个组件 |
GetComponentsInParent | 从父物体中查找所有某种组件 | 参数:需要用泛型指定查找的类型 返回值:包含所有该类型组件的数组 |
二、利用公开变量引用物体和组件
举例如下
using UnityEngine; public calss TestGetTransform : MonoBehaviour { public GameObject other; public Transform otherTrans; public MeshFilter otherMesh; public Rigidbody otherRigid; void Start() { //可以任意使用前面的变量 } }
在Inspector界面,将相应的对象或者组件拖曳到对应框框内,就可以了。这种方式非常直观,而且可以用组件类型作为限制,防止拖入错误类型的物体。
总结:
获取物体和组件的方式有以下几种:
- 通过名称或标签,找到任意未禁用的物体
- 通过父子关系,从一个物体出发,可以沿路找到任意物体
- 只要获得了某个游戏物体或该物体上的任意组件,就可以得到所有其他组件,也可以通过任意组件获得物体本身
- 可以遍历某个物体下一级的所有子物体
- 可以用公开变量的方式,在编译器里拖曳选择物体