Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向
Hey欢迎回来今天我们来搞定 Unity 的输入系统重点讲 PC 端的键盘和鼠标。 学完这个你就能做出WASD 移动 鼠标控制转向的基础移动系统输入系统Unity 有两套输入系统新旧不兼容旧输入Input Manager新输入Input System写法Input.GetKey()Input.GetAxis()Gamepad.currentKeyboard.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 物体上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教程从基础到一个网络部分有兴趣的朋友们可以收藏关注谢谢如果有疑问评论区见。