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

Unity中带Rigidbody的第三人称控制器抖动下坠问题求助

第三人称Rigidbody移动抖动+下坠问题解决思路

1. 物理操作移至FixedUpdate

Unity的物理更新逻辑(所有Rigidbody相关操作)必须在FixedUpdate中执行——Update的帧率不固定,和物理更新不同步会直接导致运动抖动。修改方式:

  • 输入读取保留在Update,把移动、旋转的物理操作移到FixedUpdate,将输入向量改为类成员变量传递数据。

代码修改示例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControler : MonoBehaviour
{
    public Rigidbody rb;
    public Transform cam;

    public float speed = 6f;
    public float turnSmoothTime = 0.1f;
    float turnSmoothVelocity;
    private Vector3 inputVector; // 改为类成员变量存储输入

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float horizontal = Input.GetAxisRaw("Horizontal");
        float vertical = Input.GetAxisRaw("Vertical");
        inputVector = new Vector3(horizontal, 0f, vertical).normalized;
    }

    void FixedUpdate()
    {
        if (inputVector.magnitude >= 0.1f)
        {
            float targetAngle = Mathf.Atan2(inputVector.x, inputVector.z) * Mathf.Rad2Deg + cam.eulerAngles.y;
            float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime);
            
            // 用Rigidbody方法处理旋转,避免直接修改transform
            rb.MoveRotation(Quaternion.Euler(0f, angle, 0f));

            Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
            // FixedUpdate中使用Time.fixedDeltaTime保证物理更新稳定
            rb.MovePosition(rb.position + moveDir * speed * Time.fixedDeltaTime);
        }
    }
}

2. 解决下坠问题

  • 检查Rigidbody设置:如果不需要玩家受重力影响,直接关闭Use Gravity;如果需要站立在地面,确保玩家(建议用CapsuleCollider)和地面(MeshCollider/BoxCollider)都有碰撞体,且地面碰撞体的Is Trigger未勾选。
  • 若需要保留重力但防止无意义下坠,可在FixedUpdate中检测地面(用Physics.Raycast或Collider.OnCollisionStay),当接触地面时锁定Y轴位置或施加向上的抵消力。

3. 优化Rigidbody设置减少抖动

在Inspector面板中调整玩家Rigidbody的参数:

  • Interpolate:选择Interpolate,让刚体在渲染帧之间做平滑插值,消除视觉上的卡顿抖动。
  • Constraints:勾选Freeze Rotation的X和Z轴,防止玩家因物理碰撞出现倾斜、翻滚,只保留Y轴旋转权限。
  • Collision Detection:如果玩家移动速度较快,设置为Continuous Dynamic,避免与地面出现穿模或抖动。

4. 禁止直接操作Transform

原代码中直接修改transform.rotation会和Rigidbody的物理模拟逻辑冲突,必须用rb.MoveRotation统一处理旋转,让物理引擎全权控制物体状态,这是消除抖动的核心要点。

内容的提问来源于stack exchange,提问作者Deb4ik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:22:33