using UnityEngine;
public class EnemyFollow : MonoBehaviour
{
public Transform player; // Referencia al jugador
public float moveSpeed = 5f; // Velocidad de movimiento del enemigo
public float rotationSpeed = 10f; // Velocidad de rotación del enemigo
public float detectionRadius = 10f; // Radio de detección para perseguir al jugador
public float attackRadius = 2f; // Radio en el que el enemigo atacará al jugador
private Rigidbody rb; // Referencia al Rigidbody del enemigo
private Vector3 randomTarget; // Posición de destino aleatorio cuando no detecta al jugador
private Animator animator; // Referencia al Animator del enemigo
void Start()
{
rb = GetComponent<Rigidbody>(); // Obtener el Rigidbody del enemigo
animator = GetComponent<Animator>(); // Obtener el Animator del enemigo
randomTarget = GetRandomTargetPosition(); // Obtener una posición de destino aleatoria
}
void Update()
{
// Verifica si el jugador está asignado
if (player != null)
{
// Calcula la distancia entre el enemigo y el jugador
float distanceToPlayer = Vector3.Distance(transform.position, player.position);
// Si el jugador está dentro del radio de detección, el enemigo lo perseguirá
if (distanceToPlayer <= detectionRadius)
{
// Calcula la dirección hacia el jugador
Vector3 direction = player.position - transform.position;
// Aseguramos que el enemigo no se mueva en el eje Y, solo en el plano XZ
direction.y = 0;
// Normaliza la dirección para mantener la velocidad constante
direction.Normalize();
// Mueve al enemigo hacia el jugador en el plano XZ (horizontal)
transform.position += direction * moveSpeed * Time.deltaTime;
// Hacer que el enemigo gire solo en el eje Y para mirar hacia el jugador
Quaternion lookRotation = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
// Si el enemigo está lo suficientemente cerca del jugador, atacar
if (distanceToPlayer <= attackRadius)
{
animator.SetTrigger("Attack"); // Dispara el trigger de la animación de ataque
}
else
{
animator.SetBool("isWalking", true); // Activar animación de caminar
}
}
else
{
// Si el jugador no está cerca, el enemigo se mueve aleatoriamente
MoveRandomly();
}
}
}
// Detecta las colisiones
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Player"))
{
// Aquí podrías aplicar una lógica para evitar que el enemigo y el jugador se junten.
// Por ejemplo, puedes detener al enemigo o hacerlo rebotar ligeramente
Vector3 pushDirection = transform.position - collision.transform.position; // Dirección opuesta al jugador
rb.AddForce(pushDirection.normalized * 5f, ForceMode.Impulse); // Empujar al enemigo un poco hacia atrás
}
}
// Método para mover aleatoriamente al enemigo cuando no está persiguiendo al jugador
private void MoveRandomly()
{
// Genera una nueva posición aleatoria a la que el enemigo debe moverse
if (Vector3.Distance(transform.position, randomTarget) < 1f)
{
randomTarget = GetRandomTargetPosition(); // Genera una nueva posición aleatoria
}
// Mueve al enemigo hacia la posición aleatoria
Vector3 direction = randomTarget - transform.position;
direction.y = 0; // Asegurarse de que solo se mueve en el plano XZ
direction.Normalize();
// Mueve al enemigo hacia la posición aleatoria
transform.position += direction * moveSpeed * Time.deltaTime;
// Hacer que el enemigo gire hacia la posición aleatoria
Quaternion lookRotation = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
}
// Método para generar una nueva posición aleatoria dentro de un rango
private Vector3 GetRandomTargetPosition()
{
float randomX = Random.Range(-10f, 10f);
float randomZ = Random.Range(-10f, 10f);
return new Vector3(randomX, transform.position.y, randomZ);
}
}
No hay comentarios.:
Publicar un comentario