using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; namespace Player { [RequireComponent(typeof(Rigidbody2D))] public class Movement : MonoBehaviour { [SerializeField] private float runSpeed; [SerializeField] private float springPower; [SerializeField] private SpriteRenderer spriteRenderer; [SerializeField] private float turnDelay; [SerializeField] private InputActionReference interactReference; private bool _onSpring; private Rigidbody2D _rb; private bool _grounded = true; private bool _facingLeft; private float _turnDelayTimer; private bool _interact; private void Awake() { _rb = GetComponent(); InputSystem.actions.FindActionMap("UI").Disable(); InputSystem.actions.FindActionMap("Player").Enable(); interactReference.action.performed += HandleInteraction; interactReference.action.canceled += HandleInteraction; } private void HandleInteraction(InputAction.CallbackContext obj) { _interact = obj.ReadValueAsButton(); } private void Update() { _turnDelayTimer += Time.deltaTime; spriteRenderer.flipX = !_facingLeft; Debug.Log($"{_onSpring} {_interact}"); if (_onSpring && _interact) { _onSpring = false; _grounded = false; _rb.linearVelocityX = 0; _rb.AddForce(Vector2.up * springPower, ForceMode2D.Impulse); } } private void FixedUpdate() { if (_grounded) { _rb.linearVelocityX = _facingLeft ? -runSpeed : runSpeed; } } private void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.layer == LayerMask.NameToLayer("Spring")) _onSpring = true; } private void OnTriggerExit2D(Collider2D other) { if (other.gameObject.layer == LayerMask.NameToLayer("Spring")) { _onSpring = false; } } private void OnCollisionStay2D(Collision2D other) { if (_turnDelayTimer < turnDelay) return; if (other.gameObject.layer == LayerMask.NameToLayer("Spring")) return; var contacts = new List(); other.GetContacts(contacts); foreach(var c in contacts) { var x = c.normal.x; if (Mathf.Abs(x) > 0.1f) { _facingLeft = !_facingLeft; _turnDelayTimer = 0f; return; } } } } }