using UnityEngine; using UnityEngine.InputSystem; namespace Aula11 { [RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(Collider2D))] [RequireComponent(typeof(Bateria))] public class ControleDrone : MonoBehaviour { [Header("Entrada")] [SerializeField] private InputActionAsset controles; [Header("Movimento")] [Min(0f)] [SerializeField] private float intensidadeImpulso = 5.5f; [Header("Referência da cena")] [SerializeField] private ControladorJogo controladorJogo; private Rigidbody2D corpo; private Bateria bateria; private float gravidadeOriginal; private InputAction acaoImpulsionar; private void Awake() { corpo = GetComponent(); bateria = GetComponent(); gravidadeOriginal = corpo.gravityScale; corpo.gravityScale = 0f; } private void OnEnable() { if (controles == null) return; acaoImpulsionar = controles.FindAction("Jogador/Impulsionar"); if (acaoImpulsionar == null) return; acaoImpulsionar.performed += AoImpulsionar; acaoImpulsionar.Enable(); } private void OnDisable() { if (acaoImpulsionar == null) return; acaoImpulsionar.performed -= AoImpulsionar; acaoImpulsionar.Disable(); } private void AoImpulsionar(InputAction.CallbackContext contexto) { if (controladorJogo == null) return; if (!controladorJogo.PartidaAtiva) { // Depois da derrota o mouse fica para os botões; teclado e controle reiniciam. if (contexto.control.device is not Mouse) controladorJogo.SolicitarReinicio(); return; } Impulsionar(); } /// Comando do jogador: inicia a partida, se preciso, e gasta uma carga no impulso. public void Impulsionar() { if (controladorJogo == null || !controladorJogo.PartidaAtiva) return; if (!controladorJogo.PartidaIniciada) { controladorJogo.IniciarPartida(); corpo.gravityScale = gravidadeOriginal; } // Sem carga, o comando é ignorado e o drone continua caindo. if (!bateria.Consumir()) return; corpo.linearVelocity = new Vector2(corpo.linearVelocity.x, 0f); corpo.AddForce(Vector2.up * intensidadeImpulso, ForceMode2D.Impulse); } private void OnCollisionEnter2D(Collision2D colisao) { if (controladorJogo != null) controladorJogo.RegistrarDerrota(); } } }