Unity墙滑功能问题:角色贴墙按住移动键无法顺滑下滑求助
墙滑卡顿问题求助:角色贴墙按住朝向墙体的移动输入时无法顺滑下滑
跟着Bendux的教程实现了墙滑和墙跳功能,复制教程代码后微调了Rigidbody2D的重力、跳跃力等参数,但出现问题:当角色贴墙时,按住朝向墙体的移动输入,角色会卡在墙上无法顺滑下滑。
玩家控制代码
using UnityEngine; public class PlayerMovement : MonoBehaviour { private float horizontal; public float speed = 8f; public float jumpingPower = 16f; private bool isFacingRight = true; private bool isWallSliding; private float wallSlidingSpeed = 2f; private bool isWallJumping; private float wallJumpingDirection; public float wallJumpingTime = 0.2f; private float wallJumpingCounter; public float wallJumpingDuration = 0.4f; private Vector2 wallJumpingPower = new Vector2(8f, 10f); [SerializeField] private Rigidbody2D rb; [SerializeField] private Transform groundCheck; [SerializeField] private LayerMask groundLayer; [SerializeField] private Transform wallCheck; [SerializeField] private LayerMask wallLayer; private void Update() { horizontal = Input.GetAxisRaw("Horizontal"); if (Input.GetButtonDown("Jump") && IsGrounded()) { rb.velocity = new Vector2(rb.velocity.x, jumpingPower); } if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f) { rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f); } WallSlide(); WallJump(); if (!isWallJumping) { Flip(); } } private void FixedUpdate() { if (!isWallJumping) { rb.velocity = new Vector2(horizontal * speed, rb.velocity.y); } } private bool IsGrounded() { return Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer); } private bool IsWalled() { return Physics2D.OverlapCircle(wallCheck.position, 0.2f, wallLayer); } private void WallSlide() { if (IsWalled() && !IsGrounded() && horizontal != 0f) { isWallSliding = true; rb.velocity = new Vector2(rb.velocity.x, Mathf.Clamp(rb.velocity.y, -wallSlidingSpeed, float.MaxValue)); } else { isWallSliding = false; } } private void WallJump() { if (isWallSliding) { isWallJumping = false; wallJumpingDirection = -transform.localScale.x; wallJumpingCounter = wallJumpingTime; CancelInvoke(nameof(StopWallJumping)); } else { wallJumpingCounter -= Time.deltaTime; } if (Input.GetButtonDown("Jump") && wallJumpingCounter > 0f) { isWallJumping = true; rb.velocity = new Vector2(wallJumpingDirection * wallJumpingPower.x, wallJumpingPower.y); wallJumpingCounter = 0f; if (transform.localScale.x != wallJumpingDirection) { isFacingRight = !isFacingRight; Vector3 localScale = transform.localScale; localScale.x *= -1f; transform.localScale = localScale; } Invoke(nameof(StopWallJumping), wallJumpingDuration); } } private void StopWallJumping() { isWallJumping = false; } private void Flip() { if (isFacingRight && horizontal < 0f || !isFacingRight && horizontal > 0f) { isFacingRight = !isFacingRight; Vector3 localScale = transform.localScale; localScale.x *= -1f; transform.localScale = localScale; } } }
相关截图
- 墙体对象
- 地面对象
- 玩家RigidBody2D组件
- 场景布局
已尝试使用教程原脚本,也反复观看教程,但问题仍未解决,恳请大家帮忙!
内容的提问来源于stack exchange,提问作者TacoGuy
相关产品推荐
相关产品推荐

