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
相关产品推荐
相关产品推荐

