using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] private Animator animator; [SerializeField] private float MovementSpeed = 1.5f; [SerializeField] private LayerMask ladderLayer; [SerializeField] private LayerMask groundLayer; [SerializeField] private float distance; private bool _isOnLadder; private Rigidbody2D _body; private BoxCollider2D _boxCollider; private bool _isFall; void Start() { _body = GetComponent(); _boxCollider= GetComponent(); } void Update() { float moveX = 0; float moveY = 0; var groundCheck = Physics2D.BoxCast(_boxCollider.bounds.center,_boxCollider.bounds.size,0f, Vector2.down, .1f,groundLayer); if (groundCheck || _isOnLadder) { _isFall =false; moveX = Input.GetAxisRaw("Horizontal"); animator.SetFloat("Horizontal", moveX); if (IsLadder(Vector2.down)) { _isOnLadder = true; moveY = Input.GetAxisRaw("Vertical"); if(moveY> 0) { if (!IsLadder(Vector2.up)) { moveY = 0; } } } else { _isOnLadder = false; } _body.velocity = new Vector2(moveX * MovementSpeed, moveY * MovementSpeed); } else { _isFall = true; print("Falling"); } } private RaycastHit2D IsLadder(Vector2 direction) { return Physics2D.BoxCast(_boxCollider.bounds.center, _boxCollider.bounds.size, 0f, direction, .1f, ladderLayer); } private void FixedUpdate() { if (_isOnLadder) { _body.gravityScale = 0; } else { _body.gravityScale = 1; } if (_isFall) { _body.velocity = new Vector2(0, _body.velocity.y); animator.SetFloat("Horizontal", 0); } } }