lunes, 31 de marzo de 2025

Enemigo

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