您的位置:首页 > 其它

Transform.Forward和Vector3.Forward的正确使用方法

2017-12-19 19:35 357 查看

Transform.Forward和Vector3.Forward的正确使用方法

发布:Unity3d培训
来源:unity3d培训教程
2016-07-23 浏览次数:3465



很多人对于Transform.Forward和Vector3.Forward的正确使用方法都不太清楚,那么今天菜鸟在线小编就来给大家介绍一下他们的用法,一起来看今天的Unity3d教程吧!

  在某个风和日丽的下午,你们的Unity3d开发传奇师兄黄高军问我,为啥他写的控制车辆,车辆不能往正前方行驶。我扫了一下他的代码,

  this.transform.Translate(transform.forward);

  这样奇怪的用法我还是第一次见!

  当时我就不高兴了,“高军,老师教什么你用什么,你说说这个transform.forward在哪学的?”

  “你看看,车辆都绕圈走了,不会用就别乱用,乖乖用我教的方法!”

  事实证明,我当时那番话说错了,后来这位传说级的师兄找到一份虚幻4的工作,圆了我毕业三年都无法圆的梦。

  我惭愧不已,写下这个研究结果,以纪念我曾经带过的那么一个优秀的学生。

  一切从汽车控制说起

  我们都知道,改变物体的坐标,可以模拟物体移动。



  场景中有辆车的位置为(0,0,0),我们想让他向前移动,通过scene界面我们发现物体向前移动得改它的z轴,于是我们可以这么写代码

  void Update () {

  this.transform.position += new Vector3 (0, 0, 1);

  }

  这么写之后,确实就往前方跑了,但是有个问题,Update一帧执行5,60次,每帧都new 一个Vector3的话,对内存是一个消耗。

  于是我们用一个系统自带的Vector3.forward(它代表Vector3(0,0,1))

  void Update () {

  this.transform.position += Vector3.forward;

  }

  所以记住,Vector3.forward是一个定值,它没有任何意义!它仅仅代表Vector3(0,0,1),仅此而已,前往别给它任何意义。

  那么上面的代码其实是有问题的。当我们把小车的旋转值改变之后,发现this.transform.position += Vector3.forward已经不能让车往前方走了,

  他需要一个正确的方向向量。

  于是transform.forward应运而生。他是一个用来自动对物体旋转值算出前进方向向量的变量。

  void Update () {

  this.transform.position += transform.forward;

  }

  我们把代码改成上面那样,就可以按照车辆向前的方向行驶了。

  所以记住,transform.forward是一个变值,它代表物体的前方的向量!会根据物体的旋转量自动算出来,如果物体时刻在旋转,这个transform.forward是会一直变化的。

  于是就有同学问了?老师不是啊,我们以前经常使用的transform.Translate(Vector3.forward)他也可以根据物体的转向进行前进动作啊,那这么说来Vector3.forward不是一个变值吗??

  void Update () {

  this.transform.Translate (Vector3.forward);

  }

  于是我们把代码改成上面那样,发现是可以根据物体旋转量进行变化,那么这里Translate是一个函数,肯定是里面偷偷进行了转换,而我们不知道。那么Unity在Translate里面偷偷做了什么转化呢?

  其实很简单

  void MyTranslate(Vector3 dir){

  transform.position += this.transform.rotation * dir;

  }

  我们自己也可以写一个Translate,这里他底层肯定也是改Position,那么后面是什么意思呢?

  this.transform.rotation是个四元素,表示一个旋转值,后面dir是一个向量,用一个四元素去乘以一个向量,得到的结果是经过四元素旋转之后的向量,是不是很简单?

  以后关于计算角度与向量之间的关系,都可以用这个方法算出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: