Menu
CoddyTech

Perseguir dentro del rango

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

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 un rango. Este slime te persigue dentro de sightRange y se queda quieto fuera de él:

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 es importante: un Rigidbody mantiene 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 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á 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 dan por vencidos 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

Haz que el lobo detecte al jugador cuando esté cerca y desista cuando esté lejos.

  1. En FixedUpdate(), calcula la distancia horizontal al jugador: si es menor que noticeRange, establece el campo bool chasing en true; si es mayor que giveUpRange, establécelo en false.
  2. Mientras chasing sea verdadero, establece rb.linearVelocity hacia el jugador a speed, conservando su valor y.
  3. De lo contrario, establece rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

Pulsa «Jugar», acércate al lobo y corre. Después, pulsa «Comprobar».

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
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity