using System.Collections; using System.Collections.Generic; using UnityEngine; public class AgenteAspBase : MonoBehaviour { public float velocidad = 3f; // Velocidad del agente public float velicidadRotacion = 100f; // Velocidad de rotación del agente en el ambiente public float radioPercepcion = 1.5f; // Visión del agente dentro del ambient public float maxBateria = 100f; // Carga maxima de batería public float bateria = 100f; // Nivel de batería public float consumoBateria = 5f; // Consumo por segundo public float cargaBateria = 20f; // Carga por segundo private bool recarga = false; private Transform basedeCarga; private enum State { BuscandoSuciedad, YendoABase, Cargando } private State estadoActual = State.BuscandoSuciedad; private void Start() { basedeCarga = GameObject.FindGameObjectWithTag("Base").transform; } private void Update() { if (recarga) return; bateria -= consumoBateria * Time.deltaTime; if (bateria <= 20f && estadoActual != State.YendoABase) { estadoActual = State.YendoABase; } switch (estadoActual) { case State.BuscandoSuciedad: MovimientoAleatorio(); DetectandoYLimpiando(); break; case State.YendoABase: VeABase(); break; } } void MovimientoAleatorio() { transform.Translate(Vector3.forward * velocidad * Time.deltaTime); if (Random.Range(0, 100) < 2) { float randomRotation = Random.Range(-90f, 90f); transform.Rotate(Vector3.up * randomRotation); } } void DetectandoYLimpiando() { Collider[] hits = Physics.OverlapSphere(transform.position, radioPercepcion); foreach (Collider hit in hits) { if (hit.CompareTag("Basura")) { Destroy(hit.gameObject); bateria -= 5f; // Limpiar consume batería } } } private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, radioPercepcion); } void VeABase() { if (basedeCarga == null) return; transform.position = Vector3.MoveTowards(transform.position, basedeCarga.position, velocidad * Time.deltaTime); Vector3 direction = (basedeCarga.position - transform.position).normalized; transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), velicidadRotacion * Time.deltaTime); } private void OnTriggerEnter(Collider other) { if (other.CompareTag("Base")) { estadoActual = State.Cargando; recarga = true; StartCoroutine(RecargaBateria()); } } IEnumerator RecargaBateria() { while (bateria < maxBateria) { bateria += cargaBateria * Time.deltaTime; print(bateria); yield return null; } bateria = maxBateria; recarga = false; estadoActual = State.BuscandoSuciedad; } private void OnCollisionEnter(Collision collision) { // Si choca contra un obstáculo, gira en otra dirección if (collision.gameObject.CompareTag("Muro")) { transform.Rotate(Vector3.up * 180); } } }