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

Unity 2D中使用Velocity实现敌人移动时无故停滞问题排查

Unity 2D敌人Velocity移动停滞问题分析与解决

问题描述

在Unity 2D中使用Velocity实现敌人移动时,敌人有时仅移动小段距离就停滞,但手动推动后又能继续移动。使用Transform和AddForce方式移动时完全正常,希望实现敌人通过Velocity持续移动直至被销毁的效果。

相关代码

public class EnemyScript : MonoBehaviour
{
    public float moveSpeed = 5;
    private Rigidbody2D _rBody;

    void Awake()
    {
        _rBody = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        Vector2 vector2 = new Vector2(moveSpeed, _rBody.velocity.y);
        _rBody.velocity = vector2;
    }
}

问题根源

  • 刚体休眠机制:Rigidbody2D默认开启休眠模式,当敌人速度趋近于0或处于静止状态时,物理引擎会让刚体进入休眠,此时FixedUpdate中的Velocity赋值可能无法唤醒刚体,导致停滞。
  • 碰撞检测模式缺陷:若刚体的Collision Detection设为Discrete,高速移动或碰撞微小物体时可能出现检测遗漏,导致敌人被"卡"在碰撞体边缘。
  • 物理材质与重叠问题:敌人碰撞体与场景物体存在微小重叠,或物理材质摩擦力过高,会产生反向力抵消Velocity设置,快速消耗敌人移动速度直至停滞。
  • Velocity赋值逻辑生硬:直接覆盖X轴速度忽略了物理引擎的实时力反馈,若敌人受到碰撞反弹力,强制赋值可能触发物理引擎的异常处理,间接导致刚体休眠。

解决方案

  1. 关闭刚体休眠:在Rigidbody2D组件中,将Sleeping Mode设为Never Sleep,确保刚体始终响应Velocity赋值。
  2. 升级碰撞检测:把Collision Detection改为Continuous或Continuous Dynamic,避免碰撞检测遗漏导致的卡顿。
  3. 优化物理材质:给敌人碰撞体设置摩擦力为0的物理材质,或降低场景其他物体的摩擦力,减少速度损耗。
  4. 调整Velocity赋值逻辑:添加刚体唤醒判断,同时用平滑过渡方式设置速度,避免生硬赋值触发异常:
    void FixedUpdate()
    {
        // 唤醒休眠的刚体
        if (_rBody.IsSleeping())
        {
            _rBody.WakeUp();
        }
        // 平滑过渡到目标速度,保留Y轴原有速度
        Vector2 targetVelocity = new Vector2(moveSpeed, _rBody.velocity.y);
        _rBody.velocity = Vector2.MoveTowards(_rBody.velocity, targetVelocity, moveSpeed * Time.fixedDeltaTime * 2);
    }
    
  5. 检查碰撞体重叠:在Scene视图中查看敌人碰撞体与其他物体是否存在初始重叠,调整碰撞体大小或位置解决重叠问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:04:58