Menu
CoddyTech

Persigue dentro del alcance

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 51 de 63.

La mayoría de los enemigos te dejan en paz hasta que te acercas. Mide la distancia hasta el jugador en cada paso de física y persíguelo solo dentro de cierto rango. Este slime te persigue dentro de sightRange y se queda quieto fuera de ese rango:

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    if (toPlayer.magnitude < sightRange)
    {
        Vector3 dir = toPlayer.normalized;
        rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
    }
    else
    {
        rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
    }
}

El else importa: un Rigidbody conserva su velocidad hasta que algo la cambia. Sin él, un slime que te pierde de vista sigue deslizándose hasta que la fricción lo detiene, y sobre hielo nunca se detiene. Como primero se estableció y en 0, toPlayer.magnitude es la distancia sobre el suelo, así que un jugador que está de pie sobre una caja junto al slime sigue contando como si estuviera a su lado.

Un solo rango tiene un punto débil. Un jugador que está de pie en su borde entra y sale de él, y el slime empieza y se detiene una y otra vez. Los enemigos evitan esto con dos rangos: detectan al jugador dentro de uno corto y se rinden solo cuando está más allá de uno más largo. Un bool recuerda si el enemigo está persiguiendo, y entre los dos rangos nada lo cambia, así que el enemigo sigue haciendo lo que estaba haciendo.

challenge icon

Desafío

Intermedio

Un lobo caza en el bosque. Escribe el script Wolf en el lobo. El Inspector le asigna player, speed (3), noticeRange (4) y giveUpRange (8). El script Player está listo.

  • Un campo bool llamado chasing indica si el lobo está persiguiendo. Empieza en false.
  • En cada paso de física, mide la distancia hasta el jugador por el suelo (sin altura). Si está más cerca que noticeRange: chasing pasa a ser true. Si está más lejos que giveUpRange: pasa a ser false. Entre ambos valores, se mantiene como está.
  • Mientras persigue, el lobo corre hacia el jugador a speed usando su Rigidbody, manteniendo su velocidad en y. De lo contrario, se queda quieto: velocidad x y z igual a 0.

Pulsa Play, acércate al lobo y huye, después pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class Wolf : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 3f;
    [SerializeField] private float noticeRange = 4f;
    [SerializeField] private float giveUpRange = 8f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // detecta al jugador, deja de perseguirlo y persíguelo o quédate quieto
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Física y jugabilidad