【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程

article/2025/6/21 11:23:03

摘要:
在 Unity 游戏开发中,键盘控制角色的移动与转向是基础功能之一。本文详细讲解如何使用 C# 实现基于 WASD 移动、QE 转向 与 Shift 加速奔跑 的角色控制器,适用于第一人称、第三人称、自由漫游等场景。通过直观的 Transform 控制方法与可配置参数,打造一个轻量、易拓展的移动系统。附完整代码与优化建议,适合新手学习与快速原型开发。


在这里插入图片描述


文章目录

  • Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程
    • 一、功能目标
    • 二、核心实现思路
      • 1. Transform 控制物体移动
    • 三、完整代码实现
    • 四、参数说明与使用方法
      • 1.使用步骤
    • 五、功能拓展建议
      • 1. 支持跳跃(空格键)
      • 2. 鼠标控制视角(自由相机模式)
      • 3. 摄像机跟随角色
      • 4. Input System 替代 Input.GetKey
    • 六、适用场景与优化建议
      • 1.适用场景
      • 2. 注意事项
    • 七、结语

Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程

在 Unity 开发中,最基础也是最实用的功能之一就是通过键盘控制角色或物体的移动和旋转。本文将带你一步步实现一个简洁且可拓展的“WASD+QE+Shift 加速”控制器,适用于第一人称/第三人称移动、无人机控制、自由漫游相机等场景。


一、功能目标

我们将用 C# 编写一个组件,满足以下需求:

  • WASD 控制角色移动

    • W:向前移动
    • S:向后移动
    • A:向左平移
    • D:向右平移
  • Q/E 控制转向

    • Q:左转(逆时针旋转Y轴)
    • E:右转(顺时针旋转Y轴)
  • Shift 加速

    • 按住 Shift 时,移动速度加倍,支持冲刺、跑步等功能表现

这个控制器最终效果是:轻量、无需复杂输入系统,适用于多数原型开发或简单的角色控制。


二、核心实现思路

1. Transform 控制物体移动

Unity 中的物体都有一个 Transform 组件,记录其位置、旋转与缩放。我们可以通过更新 transform.position 实现物体平移,通过 transform.Rotate() 来旋转物体。

transform.position += 方向向量 * 速度 * Time.deltaTime;
transform.Rotate(Vector3.up, 角度 * Time.deltaTime);

这种方式直观、高效,适合实现基础的方向键控制逻辑。


三、完整代码实现

以下是我们实现的脚本 SimpleMoveController.cs,包含移动、旋转和 Shift 加速逻辑:

using UnityEngine;public class SimpleMoveController : MonoBehaviour
{public float moveSpeed = 5f;            // 默认移动速度public float sprintMultiplier = 2f;     // 加速倍率(按住Shift时)public float rotateSpeed = 90f;         // 每秒旋转角度(度)void Update(){HandleMovement();HandleRotation();}/// <summary>/// 处理 WASD 移动/// </summary>void HandleMovement(){Vector3 moveDirection = Vector3.zero;if (Input.GetKey(KeyCode.W))moveDirection += transform.forward;if (Input.GetKey(KeyCode.S))moveDirection -= transform.forward;if (Input.GetKey(KeyCode.A))moveDirection -= transform.right;if (Input.GetKey(KeyCode.D))moveDirection += transform.right;// Shift 加速float currentSpeed = moveSpeed;if (Input.GetKey(KeyCode.LeftShift))currentSpeed *= sprintMultiplier;transform.position += moveDirection.normalized * currentSpeed * Time.deltaTime;}/// <summary>/// 处理 Q/E 旋转/// </summary>void HandleRotation(){float rotateDirection = 0f;if (Input.GetKey(KeyCode.Q))rotateDirection = -1f;if (Input.GetKey(KeyCode.E))rotateDirection = 1f;transform.Rotate(Vector3.up, rotateDirection * rotateSpeed * Time.deltaTime);}
}

四、参数说明与使用方法

将该脚本挂载到任意带有 Transform 的物体上,比如空物体、角色模型、摄像机等。在 Inspector 面板中你会看到以下参数:

参数说明默认值
Move Speed移动速度(单位/s)5
Sprint Multiplier加速倍率2
Rotate Speed转向速度(度/秒)90

1.使用步骤

  1. 创建一个 GameObject(如 Cube 或 Player)。
  2. SimpleMoveController.cs 脚本拖入该对象。
  3. 运行游戏后,用键盘 WASD 移动,Q/E 旋转,Shift 加速。

五、功能拓展建议

这个控制器简单实用,但在实际项目中你可能希望扩展以下能力:

1. 支持跳跃(空格键)

if (Input.GetKeyDown(KeyCode.Space))
{// 可以使用 Rigidbody 添加跳跃力GetComponent<Rigidbody>()?.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}

2. 鼠标控制视角(自由相机模式)

配合 transform.Rotate() 添加鼠标 deltaX/Y 控制视角变换,可实现第一人称或自由飞行。

3. 摄像机跟随角色

可让主摄像机绑定到玩家身后或头部位置,实现第三人称或第一人称视角。

public Transform cameraTarget;
void LateUpdate() {mainCamera.transform.position = cameraTarget.position;mainCamera.transform.rotation = cameraTarget.rotation;
}

4. Input System 替代 Input.GetKey

Unity 2020 后推荐使用 Input System 替代老旧的 Input.GetKey,便于跨平台、手柄支持与事件绑定。


六、适用场景与优化建议

1.适用场景

  • 第三人称角色控制器原型
  • 自由相机控制(如场景漫游)
  • 飞行器、无人机、建筑漫游控制
  • VR/AR 开发初期的摄像机移动系统

2. 注意事项

  • 该控制器不包含碰撞检测(建议结合 CharacterControllerRigidbody 实现更复杂控制)。
  • 如果项目使用物理系统,请使用 Rigidbody.MovePosition() 替代 transform.position,避免穿透。

七、结语

通过本文,我们从零实现了一个包含 WASD 控制移动QE 控制转向Shift 加速跑步 的轻量控制器,适合快速原型制作,也可以作为后续复杂角色控制逻辑的基础。


http://www.hkcw.cn/article/WmWuMKODfp.shtml

相关文章

通讯方式学习——单总线协议(2024.04.09)

参考链接1: 单总线器件DS18B20测温程序该怎么编写&#xff1f;这个视进行了详细讲解&#xff01; 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本都是搬运的大佬博客&#xff0c;觉着有用自己搞过来自己记一下&#xff0c;如…

大语言模型(LLM)入门 - (1) 相关概念

文章来自&#xff1a;大语言模型(LLM)小白入门自学项目-TiaoYu-1 GitHub - tiaoyu1122/TiaoYu-1: For People! For Freedom!For People! For Freedom! Contribute to tiaoyu1122/TiaoYu-1 development by creating an account on GitHub.https://github.com/tiaoyu1122/TiaoYu…

[9-3] 串口发送串口发送+接收 江协科技学习笔记(26个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26中断

【Linux系列】Linux/Unix 系统中的 CPU 使用率

博客目录 多核处理器时代的 CPU 使用率计算为什么要这样设计&#xff1f; 解读实际案例&#xff1a;268.76%的 CPU 使用率性能分析的意义 相关工具与监控实践1. top 命令2. htop 命令3. mpstat 命令4. sar 命令 实际应用场景容量规划性能调优故障诊断 深入理解&#xff1a;CPU …

内存管理 : 04段页结合的实际内存管理

一、课程核心主题引入 这一讲&#xff0c;我要给大家讲的是真正的内存管理&#xff0c;也就是段和页结合在一起的内存管理方式。之前提到过&#xff0c;我们先学习了分段管理内存的工作原理&#xff0c;知道操作系统采用分段的方式&#xff0c;让用户程序能以分段的结构进行编…

MCP Python技术实践

目录 1. 引言篇 1.1 什么是MCP&#xff08;Model Context Protocol&#xff09; 1.2 MCP的核心设计理念​ 1.3 MCP的技术背景 1.3 学习目标与内容概览 2. 基础理论篇 2.1 MCP协议架构详解 2.2 MCP消息格式与通信机制 2.3 MCP核心概念深入 3. 环境搭建篇 3.1 开发环境…

《数据结构初阶》【番外篇:二路归并的外排史诗】

【番外篇&#xff1a;多路归并的外排史诗】目录 前言&#xff1a;---------------介绍---------------一、实际情景二、外部排序什么是外部排序&#xff1f; 三、多路归并排序什么是多路归并排序&#xff1f; ---------------实现---------------四、文件归并文件二路归并排序思…

【JavaEE】多线程

5.线程启动&#xff08;statrt方法&#xff09; start方法内部&#xff0c;会调用系统api来在系统内核中创建出线程&#xff0c;创建完线程后会自动调用run方法。 而run方法&#xff0c;就只是描述这个线程要执行的任务。 start 和 run 得区别&#xff08;经典面试题&#xf…

leetcode hot100刷题日记——31.二叉树的直径

二叉树直径详解 题目描述对直径的理解解答&#xff1a;dfs小TIPS 题目描述 对直径的理解 实际上&#xff0c;二叉树的任意一条路径均可以被看作由某个节点为起点&#xff0c;从其左儿子和右儿子向下遍历的路径拼接得到。 那我们找二叉树的直径&#xff08;最大路径&#xff09…

C++ —— B/类与对象(下)

&#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》|《史上最强C讲解》 &#x1f3c6;我的格言&#xff1a;一切只是时间问题。 ​ 目录 一、再谈构造函数 1…

Python贷款计算器:等额本息与等额本金还款方案详解

Python贷款计算器:等额本息与等额本金还款方案详解 一、摘要二、整体架构流程1. 输入处理层2. 核心计算层3. 结果输出层三、具体技术细节1. 等额本息实现解析2. 等额本金实现解析3. 输出格式化技术四、运行1.等额本息2.等额本金五、结论附:完整代码一、摘要 本文介绍一款基于…

【Python专栏】Python中的浮点数类型

Python中的浮点数类型是有范围的,我们如何知道浮点数的范围呢?我们可以使用如下的方法来确定我们的浮点数的上下限。 Import sys Print(sys.float_info) 在编程语言中,如果我们计算的是浮点数计算,我们都会碰到计算精度的问题。原因是因为Double

【判断数字递增】2021-12-19

缘由用C/C实现数字递增问题&#xff1f;-编程语言-CSDN问答 给定一个正整数 n&#xff0c;请判断 n 的所有数位上的值是否从左到右是严格递增的。   例如&#xff1a;1589 是严格递增的。   再如&#xff1a;1336 不是严格递增的&#xff0c;中间有相同的 3。   再如&am…

计算机网络之路由表更新

1.解题思路 对新接收到的路由表进行更新&#xff0c;全部"距离"1&#xff0c;且"下一跳路由器"都写成发送方路由器的名称。 开始对比新表和原来的路由表 1.看目的网络 如果是新的目的网络&#xff0c;则直接把对应的各项信息填入表中&#xff1b;如果是相同…

前端学习(7)—— HTML + CSS实现博客系统页面

目录 一&#xff0c;效果展示 二&#xff0c;实现博客列表页 2.1 实现导航栏 2.2 实现个人信息 2.3 实现博客列表 三&#xff0c;实现博客正文页 3.2 复用 3.4 实现博客正文 四&#xff0c;实现博客登录页 4.1 版心 4.2 登录框 五&#xff0c;实现博客编辑页 5.1 …

使用 HTML + JavaScript 实现一个日历任务管理系统

在现代快节奏的生活中&#xff0c;有效的时间管理变得越来越重要。本项目是一个基于 HTML 和 JavaScript 开发的日历任务管理系统&#xff0c;旨在为用户提供一个直观、便捷的时间管理工具。系统不仅能够清晰地展示当月日期&#xff0c;还支持事件的添加、编辑和删除操作&#…

最卸载器——Geek Uninstaller 使用指南

Geek Uninstaller 是一款轻量级的第三方卸载工具&#xff0c;专为 Windows 系统设计&#xff0c;提供比系统默认卸载器更彻底的应用清除能力。它体积小、绿色免安装&#xff0c;使用起来简单直观&#xff0c;但功能却不含糊。 一、为什么要用 Geek Uninstaller&#xff1f; Wi…

在QT中,利用charts库绘制FFT图形

第1章 添加charts库 1.1 .pro工程添加chart库 1.1.1 在.pro工程里面添加charts库 1.1.2 在需要使用的地方添加这两个库函数&#xff0c;顺序一点不要搞错&#xff0c;先添加.pro&#xff0c;否则编译器会找不到这两个.h文件。 第2章 Charts关键绘图函数 2.1 QChart 类 QChart 是…

5G-A:开启通信与行业变革的新时代

最近&#xff0c;不少细心的用户发现手机信号标识悄然发生了变化&#xff0c;从熟悉的 “5G” 变成了 “5G-A”。这一小小的改变&#xff0c;却蕴含着通信技术领域的重大升级&#xff0c;预示着一个全新的通信时代正在向我们走来。今天&#xff0c;就让我们深入了解一下 5G-A&a…

web安全开发,在线%机器学习异常流量检测系统%开发demo

框架:html,css,jquery,echart,python,flask,sklearn,uniapp,apk,kdd和nsl,mysql数据库。 经验心得 这是一个响应式的 H5 页面&#xff0c;适用于手机端和电脑端&#xff0c;平板&#xff0c;各种小程序。本来想vxxx小程序和AndroidStudo写两个但是工作量太多了加上也不是商用&…