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

Unity中实现玩家碰撞梯子时将自身X坐标对齐至梯子X坐标的技术问询

Unity中实现玩家碰撞梯子时将自身X坐标对齐至梯子X坐标的技术问询

看起来你现在的思路方向是对的,但有个关键问题:你把梯子的世界坐标转换成了视口坐标来存储,这会导致后续设置玩家X坐标时用的是0-1范围的视口值,和世界空间的坐标不匹配,自然达不到对齐梯子X坐标的效果。咱们一步步来修正:

第一步:调整PlayerMovement中的变量存储逻辑

不需要把梯子坐标转成视口坐标,直接存储梯子的世界空间X坐标就好,这样后续用起来更直接:

// 替换原来的Vector3 viewportPoint和ladderX
private float ladderWorldX; // 存储梯子的世界空间X坐标
private void FixedUpdate() {
    controller.Move(horizontalMove * Time.fixedDeltaTime, verticalMove * Time.fixedDeltaTime, false, jump, isHorizontalMove, ladderWorldX);
    jump = false;
}

void Update() {
    if (Input.GetButtonDown("Up") && isLadder) {
        isHorizontalMove = false;
        animator.SetBool("Climb", true);
        rigidbody2D.gravityScale = 0;
        // 这里不需要再赋值ladderX,因为已经在触发时存好了ladderWorldX
    }
}

void OnTriggerEnter2D(Collider2D collision) {
    if (collision.gameObject.tag == "Ladder" || collision.gameObject.tag == "Ladder_Bottom") {
        // 直接获取梯子的世界X坐标,不用转视口
        ladderWorldX = collision.gameObject.transform.position.x;
        Debug.Log("梯子世界X坐标: " + ladderWorldX);
        isLadder = true;
    }
}

第二步:修正CharacterController中的移动逻辑

原来的Move方法里用视口坐标的X来设置targetVelocity是错误的,现在我们要让玩家平滑移动到梯子的世界X坐标,同时保持攀爬的垂直移动:

// 先修改Move方法的参数,把Vector3 ladderX改成float ladderWorldX
public void Move(float moveH, float moveV, bool crouch, bool jump, bool isHorizonal, float ladderWorldX) {
    // ... 保留你原来的蹲伏、地面检测等逻辑 ...

    if (m_Grounded || m_AirControl) {
        // ... 保留蹲伏相关逻辑 ...

        if (isHorizonal) {
            // 保留原来的水平移动逻辑
            targetVelocity = new Vector2(moveH * 10f, m_Rigidbody2D.linearVelocity.y);
            if (moveH > 0 && !m_FacingRight) Flip();
            else if (moveH < 0 && m_FacingRight) Flip();
        } else {
            // 计算玩家当前X到梯子X的差值,用平滑的方式移动过去
            float targetX = ladderWorldX;
            float smoothSpeed = 8f; // 可以根据手感调整这个值
            float currentX = m_Rigidbody2D.position.x;
            float smoothedX = Mathf.Lerp(currentX, targetX, smoothSpeed * Time.fixedDeltaTime);
            
            // 设置攀爬时的目标速度:X对齐梯子,Y是攀爬速度
            targetVelocity = new Vector2(smoothedX - currentX, moveV * 5f);
        }

        m_Rigidbody2D.linearVelocity = Vector3.SmoothDamp(m_Rigidbody2D.linearVelocity, targetVelocity, ref m_Velocity, m_MovementSmoothing);
    }

    // ... 保留跳跃逻辑 ...
}

额外优化建议

  • 可以在OnTriggerExit2D里添加逻辑,当玩家离开梯子碰撞区域时,恢复重力和水平移动能力:
void OnTriggerExit2D(Collider2D collision) {
    if (collision.gameObject.tag == "Ladder" || collision.gameObject.tag == "Ladder_Bottom") {
        isLadder = false;
        isHorizontalMove = true;
        animator.SetBool("Climb", false);
        rigidbody2D.gravityScale = 1f; // 恢复原来的重力值
    }
}

这样修改后,玩家碰到梯子并按下向上键时,就会平滑地把X坐标对齐到梯子的世界X坐标,同时可以正常攀爬啦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:34:29