using UnityEngine; public class Character : 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; protected bool isAllowVertical = true; protected bool isAllowHorisontal = true; private void Start() { _body = GetComponent(); _boxCollider = GetComponent(); } protected void MoveTo(float inputHorizontal,float inputVertical) { var groundCheck = Physics2D.BoxCast(_boxCollider.bounds.center, _boxCollider.bounds.size, 0f, Vector2.down, .1f, groundLayer); float v_movement=0; if (groundCheck || _isOnLadder) { isAllowVertical = false; isAllowHorisontal = true; _isFall = false; float h_movement = inputHorizontal; if (h_movement > 0 && !_facingRight) { FlipCharacter(); } if (h_movement < 0 && _facingRight) { FlipCharacter(); } animator.SetBool("Walk", h_movement != 0); if (IsLadder(Vector2.down)) { isAllowVertical = true; _isOnLadder = true; v_movement=inputVertical; if (v_movement > 0) { if (!IsLadder(Vector2.up)) { v_movement = 0; } } } else { _isOnLadder = false; } _body.velocity = new Vector2(h_movement * MovementSpeed, v_movement * 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("Walk", false); } } private void FlipCharacter() { Vector3 currentScale = gameObject.transform.localScale; currentScale.x *= -1; gameObject.transform.localScale = currentScale; _facingRight = !_facingRight; } }