目录

Component

# Component

GameObject下所附属的物件,如,Transform、MeshRenderer...的父类都是Component类。

我们在代码中可以通过this.GetComponent<Transform>()获取到指定的组件,除此之外常用的还有:

  1. GetComponentInChildren
  2. GetComponentsInChildren
  3. GetComponentInParent
  4. GetComponentsInParent

# Transform

当我们尝试修改物体的坐标时,往往第一反应是获取物体的Transform组件,然后再获取其position属性并加以修改,但实际上这个position指的却是物体相对于世界坐标系原点的位置。如果我们想让子物体相对于父物体轴心点的位置设置坐标,可以使用localpostion属性。

rotation也与上述同理

scale则不同,有localScalelossyScale

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

除了上述方法外,父物体还能通过Find()函数查找指定名称的子物体

    private void Start()
    {
        Debug.Log(this.transform.Find("Cube2"));
    }
1
2
3
4

# 物体移动 & 旋转

有时我们希望物体沿这坐标轴移动,可能第一反应是更改position

但倘若我希望沿物体坐标轴移动而不是世界坐标轴呢?

this.transform.Translate()可以很好地解决该需求。

该函数总共有四个参数:

  1. X
  2. Y
  3. Z
  4. Space.self / Space.World (参照)

同理,你也能用this.transform.Rotate()解决旋转需求。

此外,Unity也提供了绕点旋转的功能,你可以使用RotateAround()实现

RotateAround:

  1. 点坐标
  2. 围绕的轴
  3. 旋转角度(30意味着30度)

# 设置父物体

Transform对象有一个SetParent()函数,用于设置父物体

# 获取指定物体(GameObject)

先前,我们想获取某个物体,往往都得通过关系找到,但我们能否使用类似Find()的方法直接找到指定的GameObject呢?

GameObject.Find('物体名称')就能办到,但不建议使用,因为该方法是从所有GameObject中查找,因此,当游戏内GameObject对象过多时,可能会导致严重的性能消耗。

但我们如果用先前transform的方法尝试找GameObject,一旦关系层次过多,会导致代码不宜维护。

能否有一种好方法实现查找呢?

GameObject.FindGameObjectsWithTag()就能办到,通过查找特定标签从而找到指定的物体GameObject。该方法会返回一个GameObject数组。还有一种类似的是查找单个标签物体的GameObject.FindWithTag()

最近更新
01
基本知识
07-18
02
卷积神经网络识别图像
07-18
03
损失函数
07-18
更多文章>