Unity学习——变换(Transform)组件

介绍

变换(Transform)组件确定场景中每个对象的“位置(Position)”、“旋转(Rotation)”和“缩放(Scale)”。

每一个游戏对象(GameObject)都有一个变换(Transform)组件。

属性

位置:变换组件在X、Y、Z轴上的位置(后面将解释为什么不说是物体的轴上的位置信息)

旋转:变换组件绕X、Y、Z轴所旋转的度数

缩放:变换组件沿X、Y、Z轴上的缩放,值为1时则为原始大小(被导入或创建时物体的大小)

注意:变换的位置、旋转以及缩放是相对于该物体的(变换组件的)父级测量的。当没有父级时则在世界坐标下显示其属性。

相关脚本

(注:代码块上方是属性或方法的作用域、数据类型和访问权限(get/set),代码块中是具体的使用方法)

属性

public int childCount { get; }

transform.childCount

物体的(变换组件的)子对象的数目(不包括自身)


public Vector3 eulerAngles { get; set; }

transform.eulerAngles

物体旋转属性的以度为单位的欧拉角(即与变换组件中旋转的三个量相对应)


public Vector3 forward { get; set; }

transform.forward

世界空间中,物体的(变换组件的)z轴

应当注意当物体旋转角度后,其自身的坐标轴也随之变换,使用“transform.forward”可以获取物体当前自身坐标系(Local而非Global)的z轴


public bool hasChanged { get; set; }

transform.hasChanged

自从上一次"hasChanged"被设为false后,变换组件是否发生了变化?

应注意其默认值为true。因此需手动设置为false后进行检测。当其改变为true后,其真值不会自身改变为false


public int hierarchyCapacity { get; set; }

transform.hierarchyCapacity

变换在层级中数据结构的变换能力

即目前该物体在Hierarchy窗口中对应的树的可容纳最大结点数

应注意其数值会随着结点数的增加而扩容,因此对于需要频繁增加子物体的物体,可以事先设置该值比预计的最大值高一点,以避免反复修改此值造成的性能降低


public int hierarchyCount { get; }

transform.hierarchyCount 

变化在层级中数据结构的所包含的变换组件数目

即物体及其子物体所包含的变换组件的总数目


public Vector3 localEulerAngles { get; set; }

transform.localEulerAngles

物体的相对于父级所旋转的欧拉角

如需设置请注意使用正值且不要超过360度


public Vector3 localPosition { get; set; }

transform.localPosition 

物体相对于父级的位置,没有父级则与世界坐标下一致


public Quaternion localRotation { get; set; }

transform.localRotation 

物体相对于父级的旋转属性


public Vector3 localScale { get; set; }

transform.localScale 

物体相对于父级的缩放属性


public Matrix4x4 localToWorldMatrix { get; }

transform.localToWorldMatrix

将点从局部空间转换为世界空间的矩阵


public Vector3 lossyScale { get; }

transform.lossyScale

世界坐标系下物体的缩放属性

注意当物体的父级进行了缩放并且该物体旋转后,该值不再准确


public Transform parent { get; set; }

transform.parent

物体的父级的变换属性


public Vector3 position { get; set; }

transform.position

物体在世界坐标系下的位置属性


public Vector3 right { get; set; }

transform.right

世界空间中,物体的(变换组件的)x轴

应当注意当物体旋转角度后,其自身的坐标轴也随之变换,使用“transform.right”可以获取物体当前自身坐标系(Local而非Global)的x轴


public Transform root { get; }

transform.root

返回物体所在层级结构的根的变换属性,没有父级则为自身


public Quaternion rotation { get; set; }

transform.rotation

物体在世界坐标系下的变换属性,以四元数形式存储

注意它并不与变换组件中对应的旋转的三个属性对应(可以使用transform.eulerAngles进行修改)

它的值小于180度


public Vector3 up { get; set; }

transform.up

世界空间中,物体的(变换组件的)y轴

应当注意当物体旋转角度后,其自身的坐标轴也随之变换,使用“transform.right”可以获取物体当前自身坐标系(Local而非Global)的y轴


public Matrix4x4 worldToLocalMatrix { get; }

transform.worldToLocalMatrix

将点从世界空间转换为局部空间的矩阵

 

 

公开方法

public void DetachChildren();

transform.DetachChildren()

将物体的所有子对象都与其取消父子关系


public Transform Find(string n);

参数

string n:要找到的子物体的名字

返回值

如果找到了该孩子,则返回其变换组件,否则返回null

transform.Find("ChildName");
transform.Find("ChildName/GrandChildName");

通过名字n找到物体的子对象的变换组件

注意以上用法只适用于子物体而不适用与孙物体或更多层级下的物体查找

如需查找更低层级的物体,可以像路径名一样进行查找,如第二行所示


public Transform GetChild(int index);

参数

int index:子物体对应的索引

返回值

索引对应的子物体的变换组件

transform.GetChild(0);//找到第一个子物体变换组件
transform.GetChild(0).GetChild(0);//找到第一个子物体的第一个子物体的变换组件

子物体的索引在层级窗口从上至下由0开始递增


public int GetSiblingIndex();

返回值

子物体相对于父物体的索引值

transform.GetSiblingIndex();

获取物体在层级窗口下的索引,即是其父物体的从上之下的第几个物体(从0开始)

注意无父物体时,则会在层级窗口最外层从上至下由0开始排列


public Vector3 InverseTransformDirection(Vector3 direction);

参数

Vector3 direction:表示某个方向的三维向量

返回值

物体自身坐标系下direction的方向向量

transform.InverseTransformDirection(Vector3.forward);//将世界坐标系下的z轴方向转换为物体自身坐标系下的方向

将direction由世界坐标系转换为物体的自身坐标系下的向量表示

 

public Vector3 InverseTransformDirection(float x, float y, float z);

参数

float x, float y, float z:表示方向的三个轴上的参数

返回值

物体自身坐标系下(x,y,z)的方向向量

transform.InverseTransformDirection(0, 0, 1);

将(x,y,z)由世界坐标系转换为物体的自身坐标系下的向量表示


public Vector3 InverseTransformPoint(Vector3 position);

参数

Vector3 position:表示某个点(位置)的三维向量

返回值

物体自身坐标系下position的位置向量

transform.InverseTransformPoint(Camera.main.transform.position);//将世界坐标系下的主相机的位置转换为物体自身坐标系下的位置(即与相机的相对位置)

将position由世界坐标系转换为物体的自身坐标系下的向量表示

 

public Vector3 InverseTransformPoint(float x, float y, float z);

参数

float x, float y, float z:表示某个点(位置)的三个轴上的参数

返回值

物体自身坐标系下(x,y,z)的位置向量

transform.InverseTransformPoint((0,0,0));

将(x,y,z)由世界坐标系转换为物体的自身坐标系下的向量表示

 

注意这个函数会受到缩放的影响


 

public Vector3 InverseTransformVector(Vector3 vector);

参数

Vector3 vector:某个向量

返回值

物体自身坐标系下某个向量的表示

transform.InverseTransformVector(Vector3.forward);//将世界坐标系下的z轴方向转换为物体自身坐标系下的方向

vector由世界坐标系转换为物体的自身坐标系下的向量

public Vector3 InverseTransformVector(float x, float y, float z);

参数

float x, float y, float z:表示某个向量的三个轴上的参数

返回值

物体自身坐标系下(x,y,z)的转换后的向量

transform.InverseTransformVector((0,0,0));

将(x,y,z)由世界坐标系转换为物体的自身坐标系下的向量

注意这个函数会受到缩放的影响


public bool IsChildOf([NotNull] Transform parent);

参数

[NotNull] Transform parent:父对象的变换属性,空值时会提示错误

返回值

若该对象是parent的子对象或更深层次的对象,则返回true;否则返回false

transform.IsChildOf(parent.transform);

判断一个物体是否是parent的子物体或更深层的物体


public void LookAt(Transform target, [DefaultValue("Vector3.up")] Vector3 worldUp);

参数

Transform target:物体所看向的变换属性

[DefaultValue("Vector3.up")] Vector3 worldUp:所指定的向上的向量,默认值为Vector3.up,即(0,1,0)

transform.LookAt(target.transform);
transform.LookAt(target.transform,Vector3.down);

旋转变换组件,使得指向前方的向量指向目标位置

确定向前的向量(蓝轴)后,需要确定绕蓝轴旋转的角度,这里使用一个表示物体上方向的向量来约束,注意这个参数是非强制性而是以引导的作用旋转变换组件(优先确保先指向目标位置)

 

public void LookAt(Vector3 worldPosition, [DefaultValue("Vector3.up")] Vector3 worldUp);

参数

Vector3 worldPosition:物体所看向的位置

[DefaultValue("Vector3.up")] Vector3 worldUp:所指定的向上的向量,默认值为Vector3.up,即(0,1,0)

transform.LookAt(target.transform.position); 
transform.LookAt(target.transform.position,Vector3.down);

此重载函数与上方类似,不再赘述


public void Rotate(Vector3 eulers, [DefaultValue("Space.Self")] Space relativeTo);

参数

Vector3 eulers:旋转所绕的表示轴的向量(在世界坐标系下;考虑模长)

[DefaultValue("Space.Self")] Space relativeTo:确认旋转轴是在世界坐标下还是自身坐标下,默认值是在自身坐标系下

transform.Rotate(Vector3.up,Space.World);//绕世界坐标系下的(0,1,0)方向,每帧旋转1度

绕eulers对应的轴进行旋转,relativeTo确定在世界还是自身坐标系下

 

public void Rotate(float xAngle, float yAngle, float zAngle, [DefaultValue("Space.Self")] Space relativeTo);

参数

float xAngle, float yAngle, float zAngle:旋转所绕向量的三个轴上的信息(在世界坐标系下;考虑模长)

[DefaultValue("Space.Self")] Space relativeTo:确认旋转轴是在世界坐标下还是自身坐标下,默认值是在自身坐标系下

transform.Rotate(0,5,0,Space.World);//绕世界坐标系下的(0,1,0)方向,每帧旋转5度

绕(x,y,z)对应的轴进行旋转,relativeTo确定在世界还是自身坐标系下

 

public void Rotate(Vector3 axis, float angle, [DefaultValue("Space.Self")] Space relativeTo);

参数

Vector3 axis:所旋转的轴(不考虑模长)

float angle:每帧旋转的角度

[DefaultValue("Space.Self")] Space relativeTo:确认旋转轴是在世界坐标下还是自身坐标下,默认值是在自身坐标系下

transform.Rotate(Vector3.up * 5, 1, Space.World);//绕世界坐标系下的(0,1,0)方向,每帧旋转1度

以给定角度定义的度数旋转对象


public void RotateAround(Vector3 point, Vector3 axis, float angle);

参数

Vector3 point:旋转的中心点

Vector3 axis:旋转轴

float angle:每帧旋转角度

transform.RotateAround(Vector3.zero, Vector3.up, 1);//绕世界坐标原点,(0,1,0)的方向,每帧1度的速度进行旋转

public void SetAsFirstSibling();

transform.SetAsFirstSibling();

将物体移动至所在层级的首位


public void SetAsLastSibling();

transform.SetAsLastSibling();

将物体移动至所在层级的末位


public void SetParent(Transform p);

public void SetParent(Transform parent, bool worldPositionStays);

参数

Transform p/Transform parent:父对象的变换属性

bool worldPositionStays:父对象变换属性是否保持原来不变

transform.SetParent(parent.transform);
transform.SetParent(parent.transform, false);

设置物体的父对象

当worldPositionStays设为false时,设置父子关系之后,子对象的transform组件保持与未建立关系之前一致;否则物体的在世界坐标下的位置保持不变


public void SetPositionAndRotation(Vector3 position, Quaternion rotation);

transform.SetPositionAndRotation(Vector3.zero, Quaternion.Euler(Vector3.up));//将物体设置为坐标原点,旋转角度设为(0,1,0)

设置物体在世界坐标下的位置与旋转


public void SetSiblingIndex(int index);

参数

int index:要设置的索引

transform.SetSiblingIndex(1);

设置物体所在在层级中的索引,同时会真正改变层级窗口中的位置


public Vector3 TransformDirection(Vector3 direction);

参数

Vector3 direction:表示某个方向的三维向量

返回值

世界坐标系下direction的方向向量

transform.TransformDirection(Vector3.forward);//将自身坐标系下的z轴方向转换为世界坐标系下的方向

将direction由自身坐标系转换为世界坐标系下的向量表示

 

public Vector3 TransformDirection(float x, float y, float z);

参数

float x, float y, float z:表示方向的三个轴上的参数

返回值

世界坐标系下(x,y,z)的方向向量

transform.TransformDirection(0, 0, 1);

将(x,y,z)由自身坐标系转换为世界坐标系下的向量表示


public Vector3 TransformPoint(Vector3 position);

参数

Vector3 position:表示某个点(位置)的三维向量

返回值

世界坐标系下position的位置向量

transform.TransformPoint(Camera.main.transform.position);//将物体坐标系下的主相机的位置转换为坐标系下的位置

将position由自身坐标系转换为世界坐标系下的向量表示

 

public Vector3 InverseTransformPoint(float x, float y, float z);

参数

float x, float y, float z:表示某个点(位置)的三个轴上的参数

返回值

世界坐标系下(x,y,z)的位置向量

transform.TransformPoint((0,0,0));

将(x,y,z)由自身坐标系转换为世界坐标系下的向量表示

注意这个函数会受到缩放的影响


public Vector3 TransformVector(Vector3 vector);

参数

Vector3 vector:某个向量

返回值

世界坐标系下某个向量的表示

transform.TransformVector(Vector3.forward);//将物体自身坐标系下的z轴方向转换为世界坐标系下的方向

vector由物体坐标系转换为世界的坐标系下的向量

 

public Vector3 TransformVector(float x, float y, float z);

参数

float x, float y, float z:表示某个向量的三个轴上的参数

返回值

世界坐标系下(x,y,z)的转换后的向量

transform.TransformVector((0,0,0));

将(x,y,z)由物体自身坐标系转换为世界坐标系下的向量

注意这个函数会受到缩放的影响


public void Translate(Vector3 translation, [DefaultValue("Space.Self")] Space relativeTo);

参数

Vector3 translation:移动方向(考虑模长)

[DefaultValue("Space.Self")] Space relativeTo:相对自身或世界坐标系移动,默认为自身坐标系

transform.Translate(Vector3.forward,Space.World);//沿着世界坐标系下的前进方向,按每帧1单位的速度平移物体

沿translation的方向,以Space relativeTo的坐标系,根据translation的速度进行平移

 

public void Translate(float x, float y, float z, [DefaultValue("Space.Self")] Space relativeTo);

参数

float x, float y, float z:移动方向在三个轴上的属性

[DefaultValue("Space.Self")] Space relativeTo:相对自身或世界坐标系移动,默认为自身坐标系

transform.Translate(0, 0, 1,Space.World);

沿(x,y,z)的方向,以Space relativeTo的坐标系,(x,y,z)速度进行平移

 

public void Translate(Vector3 translation, Transform relativeTo);

public void Translate(float x, float y, float z, Transform relativeTo);

参数

Vector3 translation:移动方向(考虑模长)

float x, float y, float z:移动方向在三个轴上的属性

relativeTo:相对移动的变换属性

transform.Translate(Vector3.up, Camera.main.transform);//相对相机,向上方进行移动
transform.Translate(0,1,0,Camera.main.transform);//相对相机,向上方进行移动

相对relativeTo的transform属性进行移动

relativeTo为空时,则相对世界坐标移动

posted @ 2019-07-30 10:49  北特  阅读(3460)  评论(0编辑  收藏  举报