Perseguir al jugador
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 52 de 71.
Un enemigo que persigue al jugador necesita un Rigidbody para que las paredes lo detengan y pueda empujar y ser empujado. La persecución en sí consiste en una velocidad dirigida hacia el jugador, que se establece una vez por paso de física. Este zombi camina hacia lo que sea que esté en su espacio player:
[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}player.position - rb.position apunta desde el zombi hacia el jugador. Su coordenada y se establece en 0 para que el zombi camine en terreno llano cuando el jugador está más arriba o más abajo, y normalized le da una longitud de 1, así que el zombi camina a speed tanto si el jugador está a 2 unidades como a 20. La nueva velocidad conserva la velocidad y anterior, así que la gravedad sigue haciendo que el zombi caiga de un escalón. Su Rigidbody tiene Freeze Rotation activado, así que no se vuelca al caminar.
Una velocidad que estableces hace que el caminante arranque y gire de inmediato. En cambio, a un enemigo pesado, como un barril rodante, se le empuja con AddForce en el mismo FixedUpdate: gana velocidad, conserva su impulso y se pasa de largo cuando el jugador se aparta.
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);Evita mover el Transform de un perseguidor: eso lo coloca dentro de una pared tan fácilmente como en cualquier otro lugar, y el motor de física solo puede empujarlo hacia fuera después.
Desafío
IntermedioHaz que la roca ruede detrás del jugador.
- En
FixedUpdate(), estableceVector3 toPlayer = player.position - rb.position;ytoPlayer.y = 0f;, para que el empuje se mantenga a lo largo del suelo. - Llama a
rb.AddForce(toPlayer.normalized * force);, el mismo empuje tanto de cerca como de lejos. Deja libre su rotación para que la fricción la haga rodar.
Pulsa «Jugar» y corre en círculos alrededor de la roca. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Boulder : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float force = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// empuja la roca hacia el jugador, a ras del suelo
}
}
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