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

Unity角色移动突发停滞问题求助(附代码及排查信息)

角色移动停滞问题解决方案

可能原因及对应修复方案

1. 关闭Rigidbody2D的自动休眠

当Rigidbody2D速度低于阈值时,Unity会自动让其进入休眠状态,此时即便修改velocity也无法立刻唤醒刚体,进而导致移动停滞。

修复方式:

  • 在Inspector面板选中角色的Rigidbody2D组件,将Sleeping Mode设置为Never Sleep
  • 或在代码初始化时添加禁用逻辑:
void Start()
{
    rb = GetComponent<Rigidbody2D>();
    rb.sleepMode = RigidbodySleepMode2D.NeverSleep; // 禁用自动休眠
}

2. 优化输入与刚体速度的同步逻辑

直接在FixedUpdate中读取输入,避免Update与FixedUpdate的帧同步偏差(即使输入数值正常,这也是更稳妥的写法):

修改后的完整代码:

using UnityEngine;

public class CharacterController : MonoBehaviour
{
    private float speed = 5f;
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        rb.sleepMode = RigidbodySleepMode2D.NeverSleep;
    }

    private void FixedUpdate()
    {
        float horizontal = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(speed * horizontal, rb.velocity.y);
    }
}

3. 检查碰撞体与物理材质设置

角色碰撞体与场景物体的微小重叠或过高摩擦,可能触发物理引擎卡顿:

  • 微调角色碰撞体尺寸,避免与场景物体过度贴合
  • 给角色碰撞体添加Physics Material 2D,将Friction设为0,减少摩擦阻力

4. 改用AddForce替代直接设置velocity

直接覆盖velocity可能与物理引擎的其他计算冲突,改用AddForce能获得更稳定的物理表现(需配合速度限制避免无限加速):

示例代码:

private void FixedUpdate()
{
    float horizontal = Input.GetAxis("Horizontal");
    Vector2 moveForce = new Vector2(horizontal * speed * 10f, 0); // 根据需求调整力的大小
    rb.AddForce(moveForce);
    
    // 限制X轴最大速度
    Vector2 clampedVelocity = rb.velocity;
    clampedVelocity.x = Mathf.Clamp(clampedVelocity.x, -speed, speed);
    rb.velocity = clampedVelocity;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:17:21