Component
# Component
GameObject下所附属的物件,如,Transform、MeshRenderer...的父类都是Component类。
我们在代码中可以通过this.GetComponent<Transform>()
获取到指定的组件,除此之外常用的还有:
- GetComponentInChildren
- GetComponentsInChildren
- GetComponentInParent
- GetComponentsInParent
# Transform
当我们尝试修改物体的坐标时,往往第一反应是获取物体的Transform组件,然后再获取其position
属性并加以修改,但实际上这个position
指的却是物体相对于世界坐标系原点的位置。如果我们想让子物体相对于父物体轴心点的位置设置坐标,可以使用localpostion
属性。
rotation
也与上述同理
但scale
则不同,有localScale
和lossyScale
localScale: 与父物体比例,以父物体为参照缩放自身
lossyScale: 物体与模型缩放比例(自身缩放比例 * 父物体缩放比例)
# 获取子物体和根的Transform组件
// Cube -> Cube2 -> Cube3
private void OnGUI()
{
if (GUILayout.Button("Transform"))
{
foreach(Transform i in transform)
{
print(i.name); //Cube2
}
}
}
//根:this.transform.root
2
3
4
5
6
7
8
9
10
11
12
13
14
15
除了上述方法外,父物体还能通过Find()
函数查找指定名称的子物体
private void Start()
{
Debug.Log(this.transform.Find("Cube2"));
}
2
3
4
# 物体移动 & 旋转
有时我们希望物体沿这坐标轴移动,可能第一反应是更改position
。
但倘若我希望沿物体坐标轴移动而不是世界坐标轴呢?
this.transform.Translate()
可以很好地解决该需求。
该函数总共有四个参数:
- X
- Y
- Z
- Space.self / Space.World (参照)
同理,你也能用this.transform.Rotate()
解决旋转需求。
此外,Unity也提供了绕点旋转的功能,你可以使用RotateAround()
实现
RotateAround:
- 点坐标
- 围绕的轴
- 旋转角度(30意味着30度)
# 设置父物体
Transform对象有一个SetParent()
函数,用于设置父物体
# 获取指定物体(GameObject)
先前,我们想获取某个物体,往往都得通过关系找到,但我们能否使用类似Find()
的方法直接找到指定的GameObject呢?
GameObject.Find('物体名称')
就能办到,但不建议使用,因为该方法是从所有GameObject中查找,因此,当游戏内GameObject对象过多时,可能会导致严重的性能消耗。
但我们如果用先前transform的方法尝试找GameObject,一旦关系层次过多,会导致代码不宜维护。
能否有一种好方法实现查找呢?
GameObject.FindGameObjectsWithTag()
就能办到,通过查找特定标签从而找到指定的物体GameObject。该方法会返回一个GameObject数组。还有一种类似的是查找单个标签物体的GameObject.FindWithTag()