Unity中控制物体运动
在介绍控制物体运动时,首先需要了解一些基本知识:
1. Input类的常用方法
方法 | 内容 |
---|---|
GetAxis | 返回指定坐标轴的值 比如Input.GetAxis(“Mouse X”)便是获取鼠标的X轴移动速度; Input.GetAxis(“Mouse Y”)便是获取鼠标的y轴移动速度 |
GetKey | 当指定的按键被按下时返回true 比如在Update方法中添加如下代码,它将判断键盘方向键“上”是否被按住。 if(Input.GetKey(KeyCode.UpArrow)) { Debug.Log(“按下上键”); } |
GetKeyDown | 当指定的按键被用户按下后返回true |
GetMouseButton | 当指定鼠标被按住时返回true。参数0代表鼠标左键,参数1代表鼠标右键,参数2代表鼠标中键。用法如下所示: void Update() { if(Input.GetMouseButton(0)) Debug.Log("按下鼠标左键“); if(Input.GetMouseButton(1)) Debug.Log("按下鼠标右键“); if(Input.GetMouseButton(2)) Debug.Log("按下鼠标中键“); } |
GetTouch | 返回一个存放触摸信息的对象 |
2. Transform类常用的属性和方法
属性或方法 | 描述 |
---|---|
position | 世界坐标系的位置 |
localPosition | 相对于父级的位置 |
eulerAngles | 旋转的欧拉角度 |
localEulerAngles | 相对于父级的欧拉角度 |
right up forward | 物体本身x,y,z三个轴的方向 |
Translate() | 以指定方向和距离移动物体 |
Rotate() | 旋转物体 |
LookAt() | 旋转物体,使他对准目标 |
Find() FindChild() | 通过名字查找子物体,在如下的结构中,通过father.transform.Find(“child1”)即可获取child1.transform |
GetChild() | 通过索引获取子物体,在上述的结构中,通过father.transform.GetChild(0)即可获取child1.transform,通过father.transform.GetChild(1)即可获取child2.transform |
控制物体上下左右移动
在Unity中创建任意物体(Object),在Project面板中创建名为Tank(其他命名也可以,注意类名和脚本名一致)的脚本,编写代码拖到物体上,物体就能上下左右运动啦,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tank : MonoBehaviour
{
//每帧执行一次
void Update()
{
//速度
float speed = 1;
//上
if (Input.GetKey(KeyCode.UpArrow))
{
transform.eulerAngles = new Vector3(0, 0, 0);
transform.position += transform.forward * speed;
}
//下
else if (Input.GetKey(KeyCode.DownArrow))
{
transform.eulerAngles = new Vector3(0, 180, 0);
transform.position += transform.forward * speed;
}
//左
else if (Input.GetKey(KeyCode.LeftArrow))
{
transform.eulerAngles = new Vector3(0, 270, 0);
transform.position += transform.forward * speed;
}
//右
else if (Input.GetKey(KeyCode.RightArrow))
{
transform.eulerAngles = new Vector3(0, 90, 0);
transform.position += transform.forward * speed;
}
}
}
控制物体转向和前后移动
上面代码是按下左键,物体会向左方移动;按下右键,物体向右移动;按下上键,物体前进;按下下键,物体后退。现在,我想改变一下,按下“左右”键时,物体不会移动,只是改变方向进行旋转角度,按下“上下”键时,物体前进或者后退。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tank : MonoBehaviour
{
//每帧执行一次
void Update()
{
//旋转,steer是旋转速度
float steer = 20;
float x = Input.GetAxis("Horizontal");
transform.Rotate(0, x * steer * Time.deltaTime, 0);
//前进后退
float speed = 3f;
float y = Input.GetAxis("Vertical");
Vector3 s = y * transform.forward * speed * Time.deltaTime;
transform.transform.position += s;
}
}
有三个知识点需要了解一下:
- 获取轴向:Input.GetAxis(“Horizontal”)为获取横轴轴向的方法,当按下“左”键,该方法返回-1,“右”键返回1。Input.GetAxis(“Vertical”)为获取纵轴轴向的方法,按下“上”键时,该方法返回1,按下“下”键时,该方法返回-1.
- Time.deltaTime:指的是两次执行Update的时间间隔。因为 “ 距离 = 速度 * 时间 ”,所以物体,每次Update的移动距离应为 “ 距离 = 速度 * Time.detalTime” 。
- 速度的方向:transform的right、up和forward分别代表物体自身坐标系x,y,z这3个轴的方向,其中forward代表z轴,及物体前进的方向。由于速度是矢量,因此“ 速度 = transform.forward * speed ”指的是在坦克前进的方向上,每秒移动速度值(speed)指定的距离。