U1L7-2——位置与位移

Transform中的位置与位移相关

要操作这一部分,需要先掌握Vector3基础

Unity的三维空间里的位置有 相对于世界坐标系 和 相对于父对象 这两个坐标的区别
而Unity的位置坐标也不能够单独修改xyz,只能一起统一改

本章代码关键字

1
2
3
this.transform.position        //对象相对于世界坐标系的位置的属性
this.transform.localPosition //对象相对于父对象坐标系的位置的属性
this.transform.Translate(,) //Transform提供的位移方法,第一个参数填路程,第二个参数填相对哪个坐标系移动

相对于世界坐标系 和 相对于父对象 这两个坐标可能出现一样的情况:

  1. 父对象的坐标就是世界坐标系原点0,0,0
  2. 对象没有父对象

相对世界坐标系的位置

通过.position​得到的位置 是相对于世界坐标系原点的位置
可能和Inspector面板上显示的数据是不一样的,因为如果对象有父子关系 且父对象位置 不在原点 那么 和面板上肯定就是不一样的

1
this.transform.position;

相对父对象坐标系的位置

相对于父对象坐标系原点的位置,这两个坐标对我们来说很重要 如果想要以面板坐标为准来进行位置设置
那一定是通过localPosition​来进行设置的transform.localPosition​

1
this.transform.localPosition;

位置的赋值

注意! 位置的赋值不能直接改变x,y,z只能整体改变
类似于 this.transform.position.x = 10;​ 这样是错的

1
2
this.transform.position = new Vector3(10, 10, 10);
this.transform.localPosition = Vector3.up * 10;

如果只想改一个值 x,y,z要保持原有坐标一致

直接赋值

1
this.transform.position = new Vector3(19, this.transform.position.y, this.transform.position.z);

先取出来再赋值

虽然不能直接改 transform​ 的 xyz 但是 Vector3​ 是可以直接改 xyz 的
所以可以先取出来改 Vector3​ ,再重新赋值

1
2
3
Vector3 vPos = this.transform.position;
vPos.x = 10;
this.transform.localPosition = vPos;

获取朝向

如果你想得到对象当前的一个朝向,那么就是通过transform.​出来的对象当前的朝向

对象当前的面朝向

1
this.transform.forward;

对象当前的头顶朝向

1
this.transform.up;

对象当前的右手边

1
this.transform.right;

位移

首先需要理解坐标系下的位移计算公式:路程 = 方向 * 速度 * 时间

自己计算位移

想要变化的 就是 position
用当前的位置 + 我要动多长距离
因为使用的是 this.transform.forward​ 所以它始终会朝向相对与自己的面朝向取动

1
this.transform.position += this.transform.forward * 1 * Time.deltaTime;

下面是相对于世界z轴正方向移动:方向非常重要 因为 它决定了你的前进方向

1
this.transform.position += Vector3.forward * 1 * Time.deltaTime;

API计算位移

注意:一般使用API位移

  • 参数一:表示位移多少:路程 = 方向 * 速度 * 时间​ (第一个是三维方向)
  • 参数二:表示 相对坐标系 (默认 该参数是相对于自己的坐标系的)(第二个参数就是参考系)
1
2
3
4
5
6
7
8
9
10
11
12
//相对于世界坐标系的 Z轴 动
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);

//相对于世界坐标系 朝向自己的面去动
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);

//以相对于自己的坐标系为参考系 自己的面朝向(但这个面朝向是相对于世界坐标系的方向!!!)方向移动(一定不会这样让物体移动)
//这里的移动方向会把自己的朝向叠加起来,因为前一个参数是相对于世界坐标系的方向,然而移动时参考系却是自己的方向坐标系,导致方向叠加,出现了意料之外的位移方向
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);

//以相对于自己的坐标系为参考系 按照z轴移动 等同于 按照自己的面朝向移动
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);