using UnityEngine; using UnityEngine.InputSystem; [RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(PlayerInput))] public class CharacterController2D : MonoBehaviour { [SerializeField] private float _moveSpeed = 5.0f; [SerializeField] private float _jumpForce = 5.0f; [SerializeField] private LayerMask _groundLayer; [SerializeField] private Transform _groundCheckTransformA; [SerializeField] private Transform _groundCheckTransformB; [SerializeField] private Animator _animator; private Rigidbody2D _rigidBody; private InputAction _moveAction; private InputAction _jumpAction; private Vector2 _moveInput; private bool _isGrounded; private bool _isFlipped; private PlayerInput _playerInput; void Awake() { _rigidBody = GetComponent(); _playerInput = GetComponent(); _moveAction = _playerInput.actions["Move"]; _jumpAction = _playerInput.actions["Jump"]; } void OnEnable() { if (_moveAction != null) { _moveAction.Enable(); _moveAction.performed += OnMovePerformed; _moveAction.canceled += OnMoveCanceled; } if (_jumpAction != null) { _jumpAction.Enable(); _jumpAction.performed += OnJumpPerformed; } } void OnDisable() { if (_moveAction != null) { _moveAction.Disable(); _moveAction.performed -= OnMovePerformed; _moveAction.canceled -= OnMoveCanceled; } if (_jumpAction != null) { _jumpAction.Disable(); _jumpAction.performed -= OnJumpPerformed; } } private void OnMovePerformed(InputAction.CallbackContext context) { _moveInput = context.ReadValue(); if (_moveInput.x < 0 && !_isFlipped) { _isFlipped = true; transform.localScale = new Vector3(-1.0f * transform.localScale.x, transform.localScale.y, transform.localScale.z); } else if (_moveInput.x > 0 && _isFlipped) { _isFlipped = false; transform.localScale = new Vector3(-1.0f * transform.localScale.x, transform.localScale.y, transform.localScale.z); } _animator.SetBool("MoveX", true); } private void OnMoveCanceled(InputAction.CallbackContext context) { _moveInput = Vector2.zero; _animator.SetBool("MoveX", false); } private void OnJumpPerformed(InputAction.CallbackContext context) { if (_isGrounded) { _rigidBody.AddForce(Vector2.up * _jumpForce, ForceMode2D.Impulse); _animator.SetTrigger("Jump"); } } void Update() { _isGrounded = Physics2D.OverlapArea(_groundCheckTransformA.position, _groundCheckTransformB.position, _groundLayer); _animator.SetBool("Falling", !_isGrounded); if (_isGrounded) { _rigidBody.linearVelocity = new Vector2(_moveInput.x * _moveSpeed, _rigidBody.linearVelocity.y); } } }