首页/ 第 8 章 · 输入系统/ 第 117 课
LESSON 117 · 输入系统

角色移动脚本(WASD + 相机)

角色移动脚本已完成。下一课学第一人称视角控制。

⏱ 约 16 分钟📊 难度:入门🗂 第 8 章 · 输入系统📍 第 117 / 300 课
课程进度
117 / 300

🎯本节学习目标

  • 实现标准移动脚本
  • 实现相对相机移动
  • 实现转向与速度控制

🚀课程导读

几乎所有 3D 游戏都要“控制角色移动”。本课实现一个标准的第三人称移动脚本,可直接复用。

基础移动脚本

读输入、算方向、移动。

  1. 新建脚本 ThirdPersonMove 挂到角色:
  2. public float moveSpeed = 5f;
  3. void Update() {
  4. float h = Input.GetAxis("Horizontal");
  5. float v = Input.GetAxis("Vertical");
  6. Vector3 move = new Vector3(h, 0, v);
  7. move = transform.TransformDirection(move); // 转为世界方向(相对自身)
  8. transform.Translate(move * moveSpeed * Time.deltaTime, Space.World);
  9. }
  10. 这是“相对角色自身”的移动(不随相机)。
  11. 【刚体版】配合 Rigidbody:rb.velocity = move * moveSpeed;(保持 y 速度),更平滑、碰撞更稳。
  12. 【加速/减速】用 Mathf.Lerp 让速度渐进:当前速度向目标速度插值,手感更滑。
  13. 【跑步】按住 Shift 时 moveSpeed 翻倍(第 112 课 GetKey)。
💡
先跑通“自身坐标移动”,再升级到“相对相机移动”(下一步)。

相对相机移动

按相机方向移动(标准的第三人称)。

  1. 目标:按 W 是“朝相机看的方向”走,而不是“朝世界 Z”。
  2. 获取相机的前方/右方(忽略 Y):
  3. Transform cam = Camera.main.transform;
  4. Vector3 forward = cam.forward; forward.y = 0; forward.Normalize();
  5. Vector3 right = cam.right; right.y = 0; right.Normalize();
  6. Vector3 moveDir = forward * v + right * h;
  7. transform.position += moveDir * moveSpeed * Time.deltaTime;
  8. 【说明】先取相机朝向,抹平 Y 轴,得到“水平面上的相机方向”。
  9. 【朝向】让角色转向移动方向:if (moveDir.sqrMagnitude > 0.01f) transform.rotation = Quaternion.LookRotation(moveDir);
  10. 【完整版】把这段整合进一个脚本,WASD 移动 + 自动转向 + 相机任意旋转都正确。
  11. 【注意】相机需先有(第 118-119 课)。
“相对相机移动”是第三人称标准:相机朝前,W 就向前。

常见错误与排查

错误:角色斜向移动速度变快?
原因:对角输入时向量长度大于 1
解决:移动方向向量先归一化:moveDir = moveDir.normalized(或 ClampMagnitude(1))。

动手练习

课后小任务(做出来才算真的学会)

  • 实现自身坐标移动脚本
  • 升级为相对相机移动
  • 加入移动方向转向与跑步加速

本节小结

角色移动脚本已完成。下一课学第一人称视角控制。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课新版 Input System 配置入门