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

Unity 2D俯视角游戏玩家碰撞后滑动问题求助

解决Unity 2D俯视角玩家碰撞后滑动问题

问题根源

你的代码和配置存在以下关键问题:

  • 输入逻辑混乱:同时混用新输入系统回调与直接键盘检测,导致移动指令冲突
  • 碰撞处理不彻底:OnCollisionEnter2D仅触发一次,碰撞持续时刚体仍会产生速度
  • 物理材质设置错误:设置0摩擦会加剧滑动,而非阻止
  • 刚体参数未适配俯视角:默认重力、阻尼会导致碰撞后残留运动

解决方案

1. 修正输入与移动逻辑

将移动逻辑移至FixedUpdate(物理帧),统一使用新输入系统,添加碰撞状态控制:

public class PlayerMovement : MonoBehaviour 
{
    [SerializeField] float speed = 10f;
    private Vector2 movement;
    private Rigidbody2D rb;
    private bool isColliding;

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        rb.gravityScale = 0; // 关闭俯视角不需要的重力
        rb.drag = 10f; // 提高阻尼快速减速
    }

    // 绑定新输入系统的移动动作
    private void OnMovement(InputValue value)
    {
        movement = value.Get<Vector2>();
    }

    private void FixedUpdate()
    {
        if (isColliding)
        {
            rb.velocity = Vector2.zero;
            rb.angularVelocity = 0;
            return;
        }

        var moveDir = movement.normalized;
        rb.MovePosition(rb.position + moveDir * speed * Time.fixedDeltaTime);
    }

    private void OnCollisionEnter2D(Collision2D _)
    {
        isColliding = true;
        rb.velocity = Vector2.zero;
        rb.angularVelocity = 0;
    }

    private void OnCollisionExit2D(Collision2D _)
    {
        isColliding = false;
    }
}

2. 调整物理材质

  • 创建Physics Material 2D,设置:
    • Friction:1(最大化摩擦阻止滑动)
    • Bounciness:0(消除碰撞反弹)
  • 将材质赋值给玩家和所有障碍物的碰撞器

3. 优化Rigidbody2D设置

确保玩家刚体参数:

  • Body Type:Dynamic(必须启用物理碰撞)
  • Gravity Scale:0
  • Linear Drag:10+
  • Angular Drag:10+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:05:58