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.position
,Vector3.forward
和 transform.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。
-
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;
参考
- Unity3d vector3.forward和transform.forward的区别
https://blog.csdn.net/u013227473/article/details/53462823