using Code.Game.Gameplay.Player; using Code.Infrastructure.Camera; using Code.Infrastructure.Input; using Reflex.Attributes; using UnityEngine; using UnityEngine.InputSystem; namespace Code.Game.Cleaning.Player { public class PlayerControlsProvider : MonoBehaviour { [SerializeField] private PlayerMovementController playerMovementController; private IInputService _inputService; private Vector2 _movementInput; private bool _jumpDown; private bool _crouchDown; private bool _walkOn; private Transform _cameraTransform; [Inject] private void Construct(IInputService inputService, CameraStateMachine cameraStateMachine) { _cameraTransform = cameraStateMachine.Camera.transform; _inputService = inputService; _inputService.BindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Movement, MovementPerformed); _inputService.BindActionCancelled((int)ActionMappings.Cleaning, (int)CleaningActions.Movement, MovementCancelled); _inputService.BindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Jump, JumpPerformed); _inputService.BindActionCancelled((int)ActionMappings.Cleaning, (int)CleaningActions.Jump, JumpCancelled); _inputService.BindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Walk, WalkPerformed); _inputService.BindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Crouch, CrouchPerformed); _inputService.BindActionCancelled((int)ActionMappings.Cleaning, (int)CleaningActions.Crouch, CrouchCancelled); } private void CrouchPerformed(InputAction.CallbackContext obj) => _crouchDown = true; private void CrouchCancelled(InputAction.CallbackContext obj) => _crouchDown = false; private void WalkPerformed(InputAction.CallbackContext obj) => _walkOn = !_walkOn; private void JumpCancelled(InputAction.CallbackContext obj) => _jumpDown = false; private void JumpPerformed(InputAction.CallbackContext obj) => _jumpDown = true; private void MovementCancelled(InputAction.CallbackContext obj) => _movementInput = Vector2.zero; private void MovementPerformed(InputAction.CallbackContext obj) => _movementInput = obj.ReadValue(); private void Update() { if (!_cameraTransform) return; var inputs = new PlayerCharacterInputs() { MoveAxisForward = _movementInput.y, MoveAxisRight = _movementInput.x, CameraRotation = _cameraTransform.rotation, JumpDown = _jumpDown, CrouchDown = _crouchDown, CrouchUp = !_crouchDown, WalkOn = _walkOn }; playerMovementController.SetInputs(ref inputs); } private void OnDestroy() { _inputService.UnbindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Movement, MovementPerformed); _inputService.UnbindActionCancelled((int)ActionMappings.Cleaning, (int)CleaningActions.Movement, MovementCancelled); _inputService.UnbindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Jump, JumpPerformed); _inputService.UnbindActionCancelled((int)ActionMappings.Cleaning, (int)CleaningActions.Jump, JumpCancelled); _inputService.UnbindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Walk, WalkPerformed); _inputService.UnbindActionPerformed((int)ActionMappings.Cleaning, (int)CleaningActions.Crouch, CrouchPerformed); _inputService.UnbindActionCancelled((int)ActionMappings.Cleaning, (int)CleaningActions.Crouch, CrouchCancelled); } } }