Hey!欢迎回来! 今天我们来搞定 Unity 的输入系统,重点讲 PC 端的键盘和鼠标。 学完这个,你就能做出 WASD 移动 + 鼠标控制转向的基础移动系统!
输入系统
Unity 有两套输入系统,新旧不兼容:
|------|------------------------------------|--------------------------------------|
| | 旧输入(Input Manager) | 新输入(Input System) |
| 写法 | Input.GetKey() Input.GetAxis() | Gamepad.current Keyboard.current |
| 需要安装 | 不用,自带 | 需要安装 Package |
| 适用场景 | 初学、简单项目 | 手柄、触摸屏、多人本地 |
初学阶段我们用旧输入系统,够用且简单。
键盘基础 --- GetKey 系列
三个方法,三种状态
Input.GetKey(KeyCode.W) // 按住 W 的每一帧 → true
Input.GetKeyDown(KeyCode.W) // 按下 W 的那一帧 → true(其他帧 false)
Input.GetKeyUp(KeyCode.W) // 松开 W 的那一帧 → true
什么时候该用哪个?
| 方法 | 适用场景 | 举例 |
|---|---|---|
GetKey |
需要持续检测的逻辑 | 持续移动、持续旋转 |
GetKeyDown |
瞬间触发的逻辑 | 跳跃、攻击、开门 |
GetKeyUp |
松开时触发的逻辑 | 停止冲刺、松手取消瞄准 |
脚本实现按住W前进S后退
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * 5f * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * 5f * Time.deltaTime);
}
}
鼠标基础 --- GetMouseButton 系列
鼠标按键检测
Input.GetMouseButton(0) // 按住鼠标左键
Input.GetMouseButton(1) // 按住鼠标右键
Input.GetMouseButton(2) // 按住鼠标中键(滚轮)
Input.GetMouseButtonDown(0) // 按下左键那一帧
Input.GetMouseButtonUp(1) // 松开右键那一帧
鼠标位置
Input.mousePosition // 鼠标在屏幕上的像素坐标
// 左下角 = (0, 0)
// 右上角 = (屏幕宽度, 屏幕高度)
鼠标位移(最有用!)
Input.GetAxis("Mouse X") // 鼠标横向移动,返回 -1 ~ 1
Input.GetAxis("Mouse Y") // 鼠标纵向移动,返回 -1 ~ 1
注意:GetAxis 的好处是返回平滑的插值 ,不会出现跳变,比直接用 mousePosition 方便很多。
控制物体朝向 --- 鼠标控制旋转
这是今天最核心的知识点!学会这个知识点我们就可以完成今天的实现WASD 移动,鼠标控制物体转向的任务啦!
思路拆解
- 鼠标左右移动 → 控制物体绕 Y 轴旋转(左右看)
- 鼠标上下移动 → 控制"视角"绕 X 轴旋转(上下看)
那么我们先来实现鼠标左右移动,将我们的逻辑写在Update()中每帧运行并且获取我们鼠标横向移动。
void Update()
{
float mouseX = Input.GetAxis("Mouse X"); // 获取鼠标横向移动
}
在将获取的横向移动数值乘上我们的灵敏度,转化为Y轴的角度。
void Update()
{
float mouseX = Input.GetAxis("Mouse X"); // 获取鼠标横向移动
// 乘以灵敏度,转成 Y 轴旋转角度
float rotY = mouseX * rotateSpeed * Time.deltaTime;
}
最后我们是绕世界 Y 轴旋转(Space.World 固定以世界坐标为基准)。
void Update()
{
float mouseX = Input.GetAxis("Mouse X"); // 获取鼠标横向移动
// 乘以灵敏度,转成 Y 轴旋转角度
float rotY = mouseX * rotateSpeed * Time.deltaTime;
// 绕世界 Y 轴旋转(Space.World 固定以世界坐标为基准)
transform.Rotate(Vector3.up, rotY, Space.World);
}
那么我们在用同样的方式来实现鼠标的上下移动,不过要加一点小小的限制,避免天翻地覆。
void Update()
{
float mouseY = Input.GetAxis("Mouse Y"); // 获取鼠标纵向移动
// 注意:上下看是控制"视角"的 Pitch 角度
// 需要自己累加,不能直接 Rotate(会万向锁)
pitch -= mouseY * rotateSpeed * Time.deltaTime;
// 限制俯视角度(防止头 360° 转圈)
pitch = Mathf.Clamp(pitch, -45f, 45f);
// 应用旋转(物体自身 = Yaw,相机子物体 = Pitch)
transform.localRotation = Quaternion.Euler(pitch, yaw, 0f);
}
那么我们的知识点就已经学完啦,根据我们现在所学的我们就可以实现我们的任务啦!
最后脚本实现
目标效果:
- WASD 移动,W 往当前朝向的前方走
- 鼠标左右控制人物转向
- 鼠标上下控制视角俯仰(限制在 ±45°)
新建脚本 ,挂到 Player 物体上:
cs
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("移动参数")]
public float moveSpeed = 5f; // 移动速度(米/秒)
[Header("视角参数")]
public float rotateSpeed = 100f; // 旋转速度(度/秒)
public float minPitch = -45f; // 最小俯角
public float maxPitch = 45f; // 最大俯角
// 私有变量
private float pitch; // 上下看角度(绕X轴)
private float yaw; // 左右看角度(绕Y轴)
void Update()
{
//移动:朝当前朝向的方向移动
float h = Input.GetAxis("Horizontal"); // A/D
float v = Input.GetAxis("Vertical"); // W/S
Vector3 dir = new Vector3(h, 0, v);
if (dir.magnitude > 0.1f) // 有输入才移动
{
// 把"局部方向"转成"世界方向",乘以朝向的旋转
Vector3 worldDir = transform.TransformDirection(dir);
transform.position += worldDir * moveSpeed * Time.deltaTime;
}
//鼠标左右 → 控制人物整体绕 Y 轴旋转
float mouseX = Input.GetAxis("Mouse X");
yaw += mouseX * rotateSpeed * Time.deltaTime;
//鼠标上下 → 控制视角绕 X 轴俯仰(限制角度)
float mouseY = Input.GetAxis("Mouse Y");
pitch -= mouseY * rotateSpeed * Time.deltaTime;
pitch = Mathf.Clamp(pitch, minPitch, maxPitch); // 限制角度
//应用旋转:Yaw 给人物,Pitch 给相机(作为子物体)
// 人物自身:只转 Yaw(左右看)
transform.rotation = Quaternion.Euler(0f, yaw, 0f);
// 相机作为子物体:应用 Pitch(上下看)
// 找 Main Camera,如果没有就用当前物体的第一个子物体
Transform cam = Camera.main?.transform ?? transform.GetChild(0);
if (cam != null)
{
cam.localRotation = Quaternion.Euler(pitch, 0f, 0f);
}
}
}
最后效果呈现:

**今天的教学就到这里!**接下来我将连续更新90天的Untiy教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。