using System; using UnityEngine; public class Player : 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; private int _totalCoins = 0; private bool _hasKey = false; private void Start() { _body = GetComponent(); _boxCollider = GetComponent(); } public void AddCoin() { _totalCoins++; print($"player have {_totalCoins} coins"); } public void SetKey() { print($"player have key"); _hasKey =true; } public void RemoveKey() { _hasKey = false; } public bool IsHasKey() { return _hasKey; } private void Update() { float inputVertical = 0; var groundCheck = Physics2D.BoxCast(_boxCollider.bounds.center, _boxCollider.bounds.size, 0f, Vector2.down, .1f, groundLayer); if (groundCheck || _isOnLadder) { _isFall = false; float 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; } }