美文网首页
unity的人物前后左右控制

unity的人物前后左右控制

作者: 远行_2a22 | 来源:发表于2019-04-01 18:00 被阅读0次

Unity survival shooter tutorial教程中控制人物移动的代码如下:

  Vector3 movement;   
  float h =  Input.GetAxisRaw("Horizontal");
  float v =  Input.GetAxisRaw("Vertical");
  movement.Set (h, 0f, v);
  movement = movement.normalized * speed * Time.deltaTime;
  playerRigidbody.MovePosition (transform.position + movement);

但是发现当人物掉头之后,按键控制会反过来,即w键变成向后,s键向前。原来得到的h,v的正负是世界坐标系的,因此人物掉头,得到的正负就错了。

解决办法
方法1:

 if (v > 0) 
      transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);    
else if (v < 0) 
      transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);   

方法2:

if (v > 0)
     transform.position += transform.forward * moveSpeed * Time.deltaTime;
else if (v < 0)
     transform.position -= transform.forward * moveSpeed * Time.deltaTime;

方法3:

if (v!=0)
     transform.position += transform.forward * v* moveSpeed * Time.deltaTime;

上述方法可以看出,这里需要弄清楚transform.Translate()transform.positionVector3.forwardtransform.forward的区别

  • vector3.forward的值永远等于(0,0,1)。

  • transform.forward的值则等于当前物体的自身坐标系z轴在世界坐标上指向,因此不一定等于(0,0,1),但是其长度是1。

  • transform.position 是世界坐标。

  • transform.translate是自身坐标系

因此想要物体向前移动:
想要让物体向前移动,在transform.translate()上和直接修改transform.position上,差别是挺大的。

1、transform.position+= vector3.forward

等于是在世界坐标的z轴前进。

2、transform.position+=transform.forward

等于是物体自身坐标系的z轴前进。

3、transform.translate(vector3.forward,Space.Self)
等于是自身坐标系的z轴前进。效果等同于2。
函数默认参数是Space.Self

4、transform.translate(transform.forward,Space.Self)
会出现奇葩结果。

5、transform.translate(vector3.forward, Space.World)
等于是让物体沿着世界坐标的z轴前进。
效果等同方式1。

6、transform.translate(transform.forward,Space.World)

等于是让物体沿着“物体自身坐标z轴在世界坐标上的方向”前进(等同与物体沿着自身z轴前进)。
效果等同于方式2。

  1. transform.translate(transform.forward,Space.Self)
    在自身坐标系下绕着自身的z轴,结果也是有点奇葩。

总结

要想控制人物在自身基础上前进。主要方法为:

  • transform.position+=transform.forward
    在世界坐标系下,向人物自身的前方方向行走
  • transform.translate(transform.forward,Space.World)
    在世界坐标系下,向人物自身的前方方向行走
  • transform.translate(vector3.forward,Space.Self)
    在自身坐标系下,向前方行走

其他

想实现人物左右移动的话,方法类似,不再赘述,主要是把
Input.GetAxisRaw("Vertical");改为Input.GetAxisRaw("Horizontal");
forward改为right

 if (h > 0) 
      transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);  
else if (h < 0) 
      transform.Translate(-Vector3.right* moveSpeed * Time.deltaTime);

或者

if (h > 0)
     transform.position += transform.right* moveSpeed * Time.deltaTime;
else if (h < 0)
     transform.position -= transform.right* moveSpeed * Time.deltaTime;

参考

相关文章

网友评论

      本文标题:unity的人物前后左右控制

      本文链接:https://www.haomeiwen.com/subject/qhnvbqtx.html