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

相关推荐
Slow菜鸟5 小时前
AI学习篇(五) | awesome-design-md 使用说明
人工智能·学习
狐狐生风6 小时前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
狐狐生风6 小时前
LangChain RAG 基础
人工智能·python·学习·langchain·rag·agentai
yngsqq8 小时前
平面图环 内轮廓
c#
努力努力再努力FFF9 小时前
医生对AI辅助诊断感兴趣,作为临床人员该怎么了解和学习?
人工智能·学习
sakiko_10 小时前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
rockey62710 小时前
AScript之eval函数详解
c#·.net·script·eval·expression·动态脚本
Alice-YUE11 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
北山有鸟12 小时前
修改源码法和插件法
嵌入式硬件·学习
richxu2025100112 小时前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习