如何在Unity中使用WASD按键控制3D角色移动
Unity 3D角色移动零报错实现(新手友好版)
前置准备
- 场景基础配置:准备一个带碰撞体的地面、3D角色模型、默认主相机即可,不用提前装任何第三方插件
- 优先用Unity自带的
CharacterController组件做移动,别上来就用刚体,新手很容易因为重力、碰撞、插值参数调不对导致移动卡飞、穿模
第一步:给角色配置基础组件
- 选中你的3D角色对象,点Inspector面板的
Add Component,搜索Character Controller添加,初始参数不用改,默认值足够测试使用 - 注意:角色初始坐标Y轴要比地面高0.1左右,别直接贴在地面上,容易开局就卡地形触发不了移动判定
第二步:编写移动脚本
右键Project面板新建C#脚本,命名为PlayerMovement,双击打开后清空默认代码,直接粘贴以下内容:
using UnityEngine; public class PlayerMovement : MonoBehaviour { // 移动速度,后续直接在Inspector面板改数值就行,不用硬写在代码里 public float moveSpeed = 5f; // 重力参数,默认-9.81不用改 public float gravity = -9.81f; // 主相机引用,后续拖场景里的相机进来就行 public Transform mainCamera; private CharacterController _controller; private Vector3 _fallVelocity; void Start() { // 自动获取同对象上的CharacterController组件 _controller = GetComponent<CharacterController>(); } void Update() { // 落地时重置下落速度,避免下落速度无限叠加 if (_controller.isGrounded && _fallVelocity.y < 0) { _fallVelocity.y = -2f; } // 直接读取输入轴,WASD、方向键都能触发,不用自己单独写按键监听 float inputX = Input.GetAxis("Horizontal"); float inputZ = Input.GetAxis("Vertical"); // 按相机朝向计算移动方向,避免出现按W却往世界坐标Z轴走、不跟相机视角匹配的问题 Vector3 moveDirection = mainCamera.forward * inputZ + mainCamera.right * inputX; // 清空Y轴方向值,防止相机抬头/低头时角色往天上/地下钻 moveDirection.y = 0f; // 向量归一化,解决斜向移动速度比正方向快的问题 moveDirection.Normalize(); // 执行平面移动 _controller.Move(moveDirection * moveSpeed * Time.deltaTime); // 叠加重力、应用下落位移 _fallVelocity.y += gravity * Time.deltaTime; _controller.Move(_fallVelocity * Time.deltaTime); } }
第三步:参数绑定调试
- 把写好的
PlayerMovement脚本拖到角色对象上 - 选中角色,在Inspector面板找到刚挂载的脚本组件,把场景里的
Main Camera拖到脚本的mainCamera参数框里 - 点击顶部运行按钮,按WASD就能控制角色移动,觉得速度不合适直接调整
moveSpeed数值即可,数值越大移动越快
常见失败原因排查(跟着教程做失败90%是这几个问题)
- 按按键没反应:先看Console面板有没有报错,最常见的是忘了给脚本拖主相机引用、没给角色加
CharacterController组件、地面没加碰撞体 - 角色飘/往天上飞:检查是不是没清空移动方向的Y轴值,或者角色初始位置卡进地形里了
- 移动方向不对:确认主相机没有被转歪,不要把相机设为角色子对象后随意旋转相机的X/Z轴
- 斜着走速度明显更快:检查是不是漏了移动向量的
Normalize()归一化处理
新手先把基础移动跑通再额外加跳跃、冲刺、动画匹配功能,别一开始就堆一堆逻辑,出问题根本定位不到哪段写错了。
内容的提问来源于stack exchange,提问作者Brando Tejada
相关产品推荐
相关产品推荐

