实现目标
使用WS键控制坦克前进和后退,AD控制坦克原地旋转
代码详解
分别设置坦克旋转和行进的速度为steer和speed,他们都应该为float类型,我们可以将两个变量公开,以便我们在游戏界面进行微调以达到最佳效果
public float speed = 10; // 设置移动速度
public float steer = 30; // 设置坦克旋转速度
接下来就是坦克移动的核心代码,放在update里面
Input.GetKey(KeyCode.A)获取用户按下某个键,因为我们需要使用WSAD作为控制坦克行进的按钮,所以依次执行检测
或者我们还可以使用unity集成好的检测小键盘方向键的代码来代替单一的按钮检测,以提高代码的简洁程度,如下:
-
Input.GetAxis(“Horizontal”)检测水平方向键(小键盘上的左右箭头)按下,按下<-返回-1,按下->返回1
-
Input.GetAxis(“Vertical”)检测垂直方向键,按下上返回1,按下下返回-1
关于unity中物体方向
以一个物体中心作为坐标原点,物体前后对应Z轴正负;物体左右对应Y轴负正;物体垂直上下运动对应X轴正负
而我们常见的vector3向量设置的轴顺序就是XYZ
基本了解了物体轴向后,我们就可以继续写下判断条件内代码
因为我们想要按下A实现向左转,所以使用rotate函数,他接受三个参数分别是XYZ轴向的旋转角度,可知我们需要在Y轴给予一个负角度(因为坐标系中右边为正)
这里的Time.deltaTime表示两个update运行间隔时间,一般涉及到物体移动时都需要乘上这段代码,可以使移动更加顺滑而不僵硬突兀
至于坦克如何前后移动,我们只需要照葫芦画瓢即可,这里使用vector3存储好坦克下一步行进位置,然后通过transform.transform.position获取坦克位置并重新设置来达到移动的目的
void Update()
{
if(Input.GetKey(KeyCode.A)){
transform.Rotate(0,-1*steer*Time.deltaTime,0);
}else if(Input.GetKey(KeyCode.D)){
transform.Rotate(0,steer*Time.deltaTime,0);
}
if(Input.GetKey(KeyCode.W)){
Vector3 s = transform.forward*speed*Time.deltaTime;
transform.transform.position += s;
}else if(Input.GetKey(KeyCode.S)){
Vector3 s = -1*transform.forward*speed*Time.deltaTime;
transform.transform.position += s;
}
}
最后工序
将代码赋予到坦克上面(注意坦克此时的朝向是否和案件对应朝向一致),再给我们的坦克添加一个刚体好让其能在地面上行走
TIPS:由于我们将坦克的旋转速度和移动速度都设置为了public,所以我们可以在游戏运行期间点击坦克并进入其属性面板,找到该脚本位置,就可以随意修改这两个变量的值了!(但注意不要溢出了)