You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Rigidbody控制的胶囊角色莫名被甩飞问题求助

问题根源
  1. 错误的速度叠加逻辑:你在AddForce里把刚体当前的y轴速度又加回了力的参数里,再加上用了ForceMode.VelocityChange(这个模式会直接把传入的向量当作速度增量),导致y轴速度每帧都翻倍增长,很快就会突破合理范围,碰撞地面时直接被弹飞。
  2. 无速度限制: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:20:28