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.
Desafío
IntermedioUn 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
boolllamadochasingindica si el lobo está persiguiendo. Empieza enfalse. - En cada paso de física, mide la distancia hasta el jugador por el suelo (sin altura). Si está más cerca que
noticeRange:chasingpasa a sertrue. Si está más lejos quegiveUpRange: pasa a serfalse. Entre ambos valores, se mantiene como está. - Mientras persigue, el lobo corre hacia el jugador a
speedusando 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
}
}
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
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger3Disparadores
Colisionadores de disparadorOnTriggerEnterObjetos coleccionablesZonas de muerteEntrada 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
Persigue al jugadorPersigue dentro del alcancePatrullar y perseguirSalud y dañoRetrocesoRepaso: perro guardián