Unity中Rigidbody控制的胶囊角色莫名被甩飞问题求助
问题根源
- 错误的速度叠加逻辑:你在
AddForce里把刚体当前的y轴速度又加回了力的参数里,再加上用了ForceMode.VelocityChange(这个模式会直接把传入的向量当作速度增量),导致y轴速度每帧都翻倍增长,很快就会突破合理范围,碰撞地面时直接被弹飞。 - 无速度限制:x/z方向的输入没有做速度限制,持续按键时角色会一直加速,速度越来越大也会导致碰撞异常。
修复方案
1. 重构移动逻辑
直接控制刚体的x/z方向速度,保留y轴的物理模拟(重力、碰撞反弹等),同时限制最大移动速度:
修正后的代码
using UnityEngine; public class Move : MonoBehaviour { private Rigidbody rb; // 可在Inspector面板调整的移动参数 [SerializeField] private float moveSpeed = 6f; [SerializeField] private float maxMoveSpeed = 12f; void Start() { // 提前获取Rigidbody组件,避免每帧重复调用GetComponent rb = GetComponent<Rigidbody>(); } private void FixedUpdate() { // 获取水平/垂直输入 float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); // 基于角色自身朝向计算移动方向,避免世界空间方向混乱 Vector3 moveDirection = transform.right * horizontalInput + transform.forward * verticalInput; // 归一化处理,防止斜向移动时速度过快 if (moveDirection.magnitude > 1f) { moveDirection.Normalize(); } // 构建目标速度:x/z用移动方向×速度,y保留刚体当前的物理速度(重力、碰撞等) Vector3 targetVelocity = new Vector3(moveDirection.x * moveSpeed, rb.velocity.y, moveDirection.z * moveSpeed); // 限制最大移动速度,防止速度累积失控 targetVelocity = Vector3.ClampMagnitude(targetVelocity, maxMoveSpeed); // 应用最终速度 rb.velocity = targetVelocity; } }
2. 组件设置检查
- 刚体(Rigidbody)设置:Mass设为1-2,Angular Drag设为0.1(防止角色莫名旋转),勾选Use Gravity,取消Freeze Rotation里的X/Y/Z选项(避免角色倾斜)
- 碰撞器:换回Capsule Collider更贴合角色形状,地面Plane的碰撞器确保启用,且标记为Static
之前你尝试把Rigidbody设为变量报错,大概率是没在Start方法里完成赋值,或是变量声明时类型写错,上面的代码已经正确实现了组件缓存。
内容的提问来源于stack exchange,提问作者GoudyuGood
相关产品推荐
相关产品推荐

