Patrullar y perseguir
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 52 de 63.
Un guardia de patrulla recorre una ruta hasta que ve al jugador, lo persigue y vuelve a su ruta cuando el jugador se va. Ambos comportamientos se dirigen de la misma manera, hacia un punto, así que un método puede encargarse del movimiento en ambos casos. Este centinela va y viene entre dos puestos y persigue al jugador dentro de chaseRange:
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;
void Start()
{
rb = GetComponent<Rigidbody>();
goal = pointA;
}
void FixedUpdate()
{
if (Flat(player.position - rb.position).magnitude < chaseRange)
{
WalkTo(player.position);
return;
}
if (Flat(goal.position - rb.position).magnitude < 0.2f)
{
goal = goal == pointA ? pointB : pointA;
}
WalkTo(goal.position);
}
void WalkTo(Vector3 target)
{
Vector3 dir = Flat(target - rb.position).normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
Vector3 Flat(Vector3 v)
{
return new Vector3(v.x, 0f, v.z);
}La comprobación de persecución va primero, y su return omite el código de patrulla, así que la persecución tiene prioridad siempre que el jugador esté cerca. goal es un campo, por lo que el centinela lo recuerda durante la persecución: cuando el jugador se va, sigue caminando hacia el puesto al que se dirigía.
La comprobación de llegada mide la distancia sobre el suelo. Los puestos son marcadores en el suelo y el centro del centinela está a 1 unidad por encima de ellos, así que una distancia que incluya la altura nunca baja de 1 y el centinela nunca daría la vuelta. La comprobación pide menos de 0.2, no exactamente 0: a 2 unidades por segundo, el centinela se mueve 0.04 unidades por paso y casi nunca llega exactamente al puesto.
Desafío
IntermedioUn robot de seguridad patrulla el almacén. Escribe el script Robot. El Inspector le proporciona waypoints (los cuatro marcadores amarillos W0 a W3, en orden), player, speed (4) y chaseRange (4). El script Player está listo.
- Un campo
intllamadonext, que empieza en 0, es el índice del punto de ruta hacia el que se dirige el robot. - Patrulla: ve a
waypoints[next]. Cuando el robot esté a menos de 0.2 de ese punto por el suelo, avanzanextal siguiente punto de ruta y, después del último, vuelve a 0. - Persecución: mientras el jugador esté a menos de
chaseRangepor el suelo, ve hacia el jugador en su lugar. - Cuando el jugador se aleje, continúa hacia
waypoints[next], el punto de ruta al que se dirigía. - Muévete estableciendo la velocidad del Rigidbody en
speedpor el suelo, manteniendo su velocidad en y.
Pulsa Jugar, observa una ronda de la patrulla y cruza su camino; después, pulsa Comprobar.
Pruébalo tú mismo
using UnityEngine;
public class Robot : MonoBehaviour
{
[SerializeField] private Transform[] waypoints;
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float chaseRange = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// persigue al jugador cuando esté cerca o recorre la ruta de patrulla
}
}
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