如何解决玩家跳跃落地后持续滑动问题?锁X轴方案不可行
解决玩家沿自身Y轴跳跃后落地滑动的问题
问题核心是:玩家跳跃后,Rigidbody2D会保留水平方向的速度,落地时没有自动抵消该速度,导致持续滑动。直接锁定X轴会限制跳跃方向,不符合需求,我们可以通过落地时重置水平速度来解决。
修复后的代码
public float jumpForce = 10f; public Transform groundCheck; public float groundDistance = 0.4f; public LayerMask groundMask; private Rigidbody2D rb; private bool isGrounded; private void Start() { rb = GetComponent<Rigidbody2D>(); } private void FixedUpdate() { // 检测是否在地面 isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundDistance, groundMask); // 获取玩家自身Y轴方向 Vector2 direction = transform.up; // 跳跃逻辑 if (isGrounded && Input.GetButtonDown("Jump")) { rb.AddForce(direction * jumpForce, ForceMode2D.Impulse); } // 落地时重置水平方向速度,解决滑动问题 if (isGrounded) { // 保留垂直速度,将水平速度设为0 rb.velocity = new Vector2(0, rb.velocity.y); } }
关键修复点
- 在
isGrounded为true时,通过rb.velocity = new Vector2(0, rb.velocity.y);将刚体的水平速度重置为0,同时保留垂直方向的速度,避免影响落地时的物理反馈。 - 该方案不会限制玩家沿自身Y轴的左右跳跃方向,同时彻底解决落地滑动问题。
可选优化
如果需要更平滑的减速效果(比如模拟地面摩擦力),可以替换成动态调整阻尼的方式:
private void Start() { rb = GetComponent<Rigidbody2D>(); } private void FixedUpdate() { isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundDistance, groundMask); Vector2 direction = transform.up; if (isGrounded && Input.GetButtonDown("Jump")) { rb.AddForce(direction * jumpForce, ForceMode2D.Impulse); } // 动态调整阻尼模拟地面摩擦 rb.drag = isGrounded ? 3f : 0f; }
内容的提问来源于stack exchange,提问作者user20905443
相关产品推荐
相关产品推荐

