Unity中Tilemap上敌人仅特定速度下滑动推人问题求助
问题根源与修复方案
你的核心问题是直接通过Vector2.MoveTowards修改transform位置的方式,绕过了Unity物理系统的控制,所以你尝试归零速度的操作完全无效——因为这种位移是强制的,和刚体速度无关。当敌人进入攻击状态时,之前的移动帧已经给了位移,加上碰撞体的交互,就会带着玩家滑动。
以下是具体修复方法:
1. 改用Rigidbody2D控制移动(推荐方案)
这是最符合Unity物理逻辑的做法,能从根源解决滑动问题:
- 给敌人添加
Rigidbody2D组件,根据需求设置为Kinematic(不需要受重力等物理影响)或Dynamic(需要物理交互) - 替换原有的移动代码:
// 先在类中定义Rigidbody2D引用:private Rigidbody2D m_rb; // Awake中初始化:m_rb = GetComponent<Rigidbody2D>(); // 移动逻辑修改为 if (m_target != null && Vector2.Distance(transform.position, m_target.transform.position) <= m_targetRange && !m_isAttacking) { Vector2 direction = (m_target.transform.position - transform.position).normalized; // Kinematic刚体用MovePosition m_rb.MovePosition(transform.position + (Vector3)direction * m_speed * Time.deltaTime); // 如果是Dynamic刚体,改用velocity控制 // m_rb.velocity = direction * m_speed; } - 进入攻击状态时,直接终止刚体的移动:
if (m_target != null && Vector2.Distance(transform.position, m_target.transform.position) <= m_attackRange && m_timeSinceLastAttack >= m_attackRate && !m_isAttacking) { m_isAttacking = true; m_timeSinceLastAttack = 0; // 立即停止移动 m_rb.velocity = Vector2.zero; // 如果是Kinematic刚体,不需要这行,停止调用MovePosition就会静止 }
2. 若坚持使用transform直接移动(不推荐)
在攻击状态下彻底锁定位移,避免残留动量:
- 在Update中添加攻击状态下的位置锁定逻辑:
if (m_isAttacking) { // 将敌人固定在与玩家保持攻击距离的位置,避免碰撞重叠 Vector2 direction = (m_target.transform.position - transform.position).normalized; transform.position = m_target.transform.position - direction * m_attackRange; }
3. 优化攻击状态的判断逻辑
当前用normalizedTime > 1判断动画结束存在帧延迟,建议改用动画事件:
- 在敌人的攻击动画最后一帧添加动画事件,调用自定义方法设置
m_isAttacking = false,确保攻击状态的切换精准无延迟
4. 物理层与材质补充
- 检查敌人和玩家的碰撞层设置,确保仅必要层之间发生碰撞
- 若使用Dynamic刚体,给敌人的Collider2D添加高摩擦力的物理材质,进一步抑制滑动
内容的提问来源于stack exchange,提问作者Dennis Groß
相关产品推荐
相关产品推荐

