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

相关推荐
sp_fyf_20242 小时前
【大语言模型】OpenVLThinkerV2:面向多领域视觉任务的通用型多模态推理模型
人工智能·深度学习·学习·语言模型·transformer
星夜泊客2 小时前
unity 海底海洋资源OceanEnviromentPackUrp材质丢失修正
unity·游戏引擎·材质
被考核重击2 小时前
基础算法学习
学习·算法
creator_Li2 小时前
Kafka 全面技术笔记
笔记·学习·kafka
楼田莉子2 小时前
设计模式:构造器模式
开发语言·c++·后端·学习·设计模式
南境十里·墨染春水2 小时前
linux学习进展 进程
linux·运维·学习
sp_fyf_20242 小时前
【大语言模型】 语言模型学习什么以及何时学习?隐式课程假说
人工智能·学习·语言模型
星辰即远方2 小时前
UI学习2
学习·ui
William_cl2 小时前
C# ASP.NET 分层架构实战:BLL (Service) 业务层从入门到封神(规范 + 避坑)
架构·c#·asp.net