Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向

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教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。

相关推荐
へ蟲児.7 小时前
2026三大自带完整体系的英语学习App深度测评:哪款更适合儿童启蒙?
学习
小羊没烦恼!7 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
苦猿的大模型日记7 小时前
Day64|从0学习 Claude Code(十四):MCP,给 Agent 装个工具插座
学习
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(82):ReasoningBank——从成功与失败经验中沉淀可复用的推理记忆
论文阅读·人工智能·学习·开源·github
Lost of 程序猿8 小时前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
ebiobiz8 小时前
STM32F4 Unity 单元测试与多次测试失败率统计详细步骤
stm32·unity·单元测试
旖旎夜光9 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控
凉、介9 小时前
深入理解 ARM SCP Firmware 的 Event 与 Notification 机制
学习·scp·嵌入式·arm
minglie19 小时前
几何变换群矩阵表示与埃尔朗根纲领
学习
dadaobusi9 小时前
学习: ARM SMMU stream id
arm开发·学习