角色移动的方式有很多种,比如transform自带的translate,或者物理引擎添加力Rigidbody.AddForce,再或者Lerp插值使用曲线,或导航系统或动画系统以及各种插件例如CharacterController的move和simplemove等等,其中物理引擎通过施加力的方式移动,这里不懂得可以去查一下牛顿运动定律啦~,Translate以及Lerp都是通过更改角色的位置、旋转、缩放去达到移动的效果,而插件则不同这里不做举例。
这里我们介绍简单的几种方式,剩下的方式后续陆续补充。
一、获取鼠标键盘输入方式
这里介绍常用的获取方式:
1.使用Input.GetKey或Input.GetKeyDown或Input.GetKeyUp获得键盘各个按键,其中GetKey为按键持续按压,GetKeyDown为点击一次,GetKeyUp为抬起一次。例如获取按键A单机一下为:
Input.GetKeyDown(KeyCode.A);
2.按下图找到ImputManager的Axes:
里面包含了例如水平轴输入Horizontal,竖直Vertical以及鼠标信息等,其中可以自己设置输入方式
在代码中的获取方式为:
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
注意一定要将GetAxisRaw(“”");双引号里面的名字写对,区分大小写。其中GetAxisRaw不做平滑处理而GetAxis做平滑处理,我希望我的移动精准控制,所以使用GetAxisRaw。
一、Translate
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
if (vertical > 0)
{
this.gameObject.transform.Translate(MoveSpeed*Time.deltaTime*up);
}
if (vertical < 0)
{
this.gameObject.transform.Translate(MoveSpeed * Time.deltaTime * -up);
}
if (horizontal > 0)
{
this.gameObject.transform.Translate(MoveSpeed * Time.deltaTime * Vector3.right);
}
if (horizontal < 0)
{
this.gameObject.transform.Translate(MoveSpeed * Time.deltaTime * Vector3.left);
}
获取键盘输入后判断按键的方向,例如水平轴>0那一定是向右移动,因为GetAxisRaw返回[-1,1]的值。
如果向右移动则:让物体的Transform组件的Translate方法移动。这里movespeed代表移动速度,Time.deltaTime为一秒,right为Vector(1,0,0)。所以参数为速度乘以时间沿right方向前进,其他原理相同。
二、物理引擎
1.直接设置速度
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); rigidbody.velocity = new Vector3(move.x * moveSpeed, rigidbody.velocity.y, move.z * moveSpeed);
2.施加力加速度
rigidbody.AddForce(new Vector3(forceX, 0f, forceZ), ForceMode.Impulse);
上面施加了一个瞬时力让他移动。
具体放到物理引擎一章一并发出。
三、Lerp
对于Lerp的平滑处理有一个坑:
Vector3.Lerp(this.transform.position, 目标位置, Time.deltaTime);
问题在于平滑处理时候他会让对象无限接近目标位置,但永远不会完全到达,所以你会发现他的移动慢->快->慢的方式,有点像芝诺的乌龟。这里有两种方法解决,一种是使用曲线解决,一种是让插值因子不断改变一直相对于当前位置与目标位置的固定值。
具体结局方法与导航、动画系统等放到后续进行详细解释。如果需要可以评论优先发出。
四、CharacterController
因为上面提到了CharacterController,这里提个醒就是他与物理引擎尽量不要一起使用否则造成角色移动乱象。