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; private bool _facingRight = true; void Start() { _body = GetComponent(); _boxCollider = GetComponent(); } void Update() { float inputHorizontal = 0; float inputVertical = 0; var groundCheck = Physics2D.BoxCast(_boxCollider.bounds.center, _boxCollider.bounds.size, 0f, Vector2.down, .1f, groundLayer); if (groundCheck || _isOnLadder) { _isFall = false; inputHorizontal = Input.GetAxisRaw("Horizontal"); if (inputHorizontal > 0 && !_facingRight) { FlipCharacter(); } if (inputHorizontal < 0 && _facingRight) { FlipCharacter(); } animator.SetBool("PlayerWalk", inputHorizontal != 0); if (IsLadder(Vector2.down)) { _isOnLadder = true; inputVertical = Input.GetAxisRaw("Vertical"); if (inputVertical > 0) { if (!IsLadder(Vector2.up)) { inputVertical = 0; } } } else { _isOnLadder = false; } _body.velocity = new Vector2(inputHorizontal * MovementSpeed, inputVertical * MovementSpeed); } else { _isFall = true; } } 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) { if (IsLadder(Vector2.down)) { _isOnLadder = true; } _body.velocity = new Vector2(0, _body.velocity.y); animator.SetBool("PlayerWalk", false); } } private void FlipCharacter() { Vector3 currentScale = gameObject.transform.localScale; currentScale.x *= -1; gameObject.transform.localScale = currentScale; _facingRight = !_facingRight; } }