Unity 3D脚本使用系列: Transform基本类

Unity 3D脚本使用系列: Transform基本类

transform是每一个GameObject必须拥有的一个组件,用来管理所在GameObject对象的坐标位置、旋转角度和大小缩放。

目录

1. transform类的实例属性

1.1 eularAngles属性:欧拉角

  • 在(Unity 3D)U3D中使用四元数Quaternion来存储和表示GameObject的旋转角度。
  • 只能对transform.eularAngles进行整体赋值,例如transform.eularAngles = new Vector(1.0f,2.0f,3.0f),不可以对transform.eularAngles的单独分量进行赋值,例如transform.eularAngles.x = 1.0f是不可以的。
  • transform.eularAngles进行赋值或者获取的的时候,值都是相对世界坐标系而言的,若需要是相对父物体进行的角度变换则需要使用属性localEularAngles来设置。
  • transform.eularAngles使用顺规z-x-y,即transform.eularAngles = new Vector3(10.0f, 20.0f, 30.0f),则GameObject对象会沿着z轴先旋转30°,再沿着x轴旋转10°,最后再沿着y轴旋转20°。

1.2 hasChanged属性:transform组件是否被修改

此属性用于判断GameObject对象从上次将此属性设置为false以来,其transform组件的属性是否发生了变化。

1.3 localPosition属性:局部坐标系位置

此属性用于设置或返回GameObject对象在局部坐标系中的位置,若无父级对象则和属性Transform.position返回值一样。
要想完全了解localPosition,那么需要把localposition和position、localScale放在一起讨论。

  • 情形一
Cube World Position Local Position Local Scale
Cube0 (1.0f,0.5f,-0.5f) (1.0f,0.5f,-0.5f) (1.0f,1.0f,1.0f)
Cube1 (5.0f,1.8f,2.5f) (4.0f,1.3f,3.0f) (1.0f,1.0f,1.0f)
Cube2 (10.0f,15.0f,20.6f) (5.0f,13.2f,18.1f) (1.0,1.0,1.0)

解释:通过相对位移的关系不难看出他们之间的关系。具体的测试代码可以在我个人GitHub中查看。

  • 情形二
Cube World Position Local Position Local Scale
Cube0 (1.0f,0.5f,-0.5f) (1.0f,0.5f,-0.5f) (1.0f,2.0f,1.0f)
Cube1 (5.0f,3.1f,2.5f) (4.0f,1.3f,3.0f) (1.0f,1.0f,1.0f)
Cube2 (10.0f,29.5f,20.6f) (5.0f,13.2f,18.1f) (1.0,1.0,1.0)

解释:情形二中由于父节点Cube0的LocalScale的变化导致其子孙节点的World Position发生变化。发生变化的具体计算方式是:

当子节点的Local Position为(son_x, son_y, son_z),父节点的LocalScale为(dad_x,dad_y,dad_z),父节点的World Position为(dad_positionx,dad_positiony,dad_positionz).

子节点的World Position为(son_x*dad_x+dad_positionx,son_y*dad_y+dad_positiony,son_z*dad_z+dad_positionz)

  • 情形三
Cube World Position Local Position Local Scale
Cube0 (1.0f,0.5f,-0.5f) (1.0f,0.5f,-0.5f) (1.0f,2.0f,1.0f)
Cube1 (5.0f,3.1f,2.5f) (4.0f,1.3f,3.0f) (1.0f,2.0f,1.0f)
Cube2 (10.0f,55.9f,20.6f) (5.0f,13.2f,18.1f) (1.0,1.0,1.0)

解释:Cube0是Cube1的父节点,Cube1是Cube2的父节点。通过情形三的实验,发现Local Scale造成的影响具有累计效应。

1.3 parent属性:父物体Transform实例

此属性用于返回父物体的Transform实例。transform.parent只能返回夫以及对象的Transform,若要返回父物体的父物体,可以使用transform.parent.parent,更多级父物体依此类推。若父物体不存在,则返回null。如果想返回transform中最顶层的父物体,可以使用transform.root。

1.4 Matrix属性:转换矩阵

转换矩阵分为两个部分,从世界坐标系到自身坐标系的转换,以及从自身坐标系到世界坐标系的转换。暂时涉及的项目还没有该属性的使用需求,不做深入学习。

2. Transform实例方法

2.1 Rotate方法:绕轴旋转旋转

2.1.1 绕坐标轴旋转

此方法的功能是是的transform实例在relativeTo的坐标系中旋转欧拉角eularAngles。

//基本语法
public void Rotate(Vector3 eularAngles);
public void Rotate(Vector3 eularAngles, Space relativeTo);
public void Rotate(float xAngle, float yAngle, float zAngle);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo);

解释:其中参数eularAngles为transform要旋转的欧拉角,可以是以Vector3的形式给出,也可以分别给出三个角度值。参数relativeTo为transform旋转时候参考的坐标系,如果不特殊说明,默认为Space.Self。

对立方体cubea进行操作,分别按照以自身坐标系为参照系、以世界坐标系为参照系、默认参照系。首先通过给transform.eulerAngles直接赋值,将自身坐标系绕x轴做一旋转。然后使用Rotate函数进行旋转。

        cubea.transform.eulerAngles = new Vector3(30.0f, 0.0f, 0.0f);
        Debug.Log("Space.Self1:" + cubec.transform.eulerAngles);
        cubea.transform.Rotate(new Vector3(0.0f, 45.0f, 0.0f), Space.Self);
        Debug.Log("Space.Self2:" + cubec.transform.eulerAngles);

        cubea.transform.eulerAngles = new Vector3(30.0f, 0.0f, 0.0f);
        cubea.transform.Rotate(new Vector3(0.0f, 45.0f, 0.0f), Space.World);
        Debug.Log("Space.World:" + cubec.transform.eulerAngles);

        cubea.transform.eulerAngles = new Vector3(30.0f, 0.0f, 0.0f);
        cubea.transform.Rotate(new Vector3(0.0f, 45.0f, 0.0f));
        Debug.Log("默认坐标系:" + cubec.transform.eulerAngles);

经过上述代码可以获得如下的结果:
这里写图片描述

2.1.2 绕某个向量旋转

此方法是使得GameObject对象在relativeTo坐标系中绕轴向量axis旋转angle度。如果想使GameObject对象实例绕着某个物体旋转,则需要使用Transform.RotateAround(point:Vector3, axis: Vector3, angle:float).

//基本语法
public void Rotate(Vector3 axis, float angle);
public void Rotate(Vector3 axis, float angle, Space relativeTo)

其中axis为旋转轴方向,参数angle为旋转角度,参数relativeTo为参考坐标系,默认为Space.Self。

2.2 RotateAround方法:绕轴点旋转

此方法的功能是是的GameObject对象绕着point点的axis方向旋转angle度。

//基本语法
public void RotateAround(Vector3 axis, float angle);
public void RotateAround(Vector3 point,Vector3 axis,float angle)

其中,参数point为参考坐标系,参数axis为旋转轴方向,参数angle为旋转角度。

2.3 旋转方式总结

旋转实现的方式:

  • transform.Rotate()
  • transform.RotateAround()
  • transform.rotation = Quaternion.Eular(x,y,z)
  • transform.localRotation = Quaternion.Euler(x,y,z)
  • transform.eularAngles = new Vector3(x,y,z)
  • transform.localEulerAngles = new Vector(x,y,z)

前两种是通过transform的实例方法来实现的,在2.1和2.2中已经进行了阐述。
下面分别讲述剩余4种
transform.rotation = Quaternion.Eular(x,y,z)
效果:代表了物体的旋转,不能直接为transform.rotation赋值。可以使用各种Quaternion的方法。
transform.eularAngles = new Vector3(x,y,z)
效果:与Quaternion.enlerAngles基本相同,用来设定物体的旋转角度,但不要分别设置xyz,要整体赋值。

注意以下三种方式最后得到的结果都是一样的,只是在赋值的方式上有差异。(以上两种方式都不涉及到本地坐标系的问题)

GameObject Cube;
Cube.transform.Rotate(a,b,c); //1
Cube.transform.Rotate(new Vector3(a,b,c)); //1.1
Cube.transform.rotation = Quaternion.Eular(a,b,c); //2
Cube.transform.eularAngles = new Vector3(a,b,c) //3

transform.localRotation = Quaternion.Euler(x,y,z)
效果:在父物体的坐标系下的旋转变换

transform.localEulerAngles = new Vector(x,y,z)
效果:在父物体的坐标系下的旋转欧拉角

// 1
cube2.transform.localEulerAngles = new Vector3(0.0f, 50.0f, 0.0f);
// 2
cube2.transform.localRotation = Quaternion.Euler(0.0f, 50.0f, 0.0f);
//2种方法获得的结果相同

2.4 Translate方法:相对坐标系移动

此方法的功能是是的GameObject对象在relativeTo的坐标系空间中移动参数translation指定的向量。

//基本语法
public void Translate(Vector3 translation);
public void Translate(Vector3 translation, Space relativeTo);
public void Translate(float x, float y, float z);
public void translate(float x, float y, float z, Space relativeTo);

可以看出:赋值当中,要么通过float或者通过Vector3进行角度赋值,选择relativeTo或者选择默认。

猜你喜欢

转载自blog.csdn.net/loongkingwhat/article/details/80568507
今日推荐