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.
Desafío
IntermedioHaz que el lobo detecte al jugador cuando esté cerca y desista cuando esté lejos.
- En
FixedUpdate(), calcula la distancia horizontal al jugador: si es menor quenoticeRange, establece el campobool chasingentrue; si es mayor quegiveUpRange, establécelo enfalse. - Mientras
chasingsea verdadero, establecerb.linearVelocityhacia el jugador aspeed, conservando su valor y. - 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
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puerta6Raycasts
Physics.RaycastRaycastHitComprobación del suelo con un rayoCapas y LayerMaskLínea de visiónOverlapSphere y SphereCastRepaso: cable trampa láser9Enemigos
Perseguir al jugadorPerseguir dentro del rangoPatrullar y perseguirSalud y dañoBalas que impactanRetrocesoRepaso: perro guardiánPractica por tu cuenta: Playground de Unity