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

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

  this.transform.Translate(transform.forward);

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

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

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

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

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

  一切从汽车控制说起

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

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

  场景中有辆车的位置为(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是一个向量,用一个四元素去乘以一个向量,得到的结果是经过四元素旋转之后的向量,是不是很简单?

  以后关于计算角度与向量之间的关系,都可以用这个方法算出来。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值