Persigue al jugador
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 50 de 63.
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 componente y se establece en 0 para que el zombi camine en horizontal 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 antigua velocidad y, así que la gravedad sigue tirando del zombi hacia abajo cuando baja de un escalón. Su Rigidbody tiene activada la opción Freeze Rotation, así que no se vuelca mientras camina.
Una velocidad que estableces hace que el enemigo comience a moverse y gire de inmediato. En cambio, puedes empujar a un enemigo pesado con AddForce dentro del mismo FixedUpdate: va ganando velocidad, conserva su impulso y se pasa de largo cuando el jugador se aparta. Evita mover el Transform de un perseguidor: eso lo coloca dentro de una pared con la misma facilidad que en cualquier otro sitio, y el motor de física solo puede empujarlo hacia fuera después.
Desafío
IntermedioUna roca rueda detrás del jugador. Escribe el script Boulder en la roca, una esfera con un Rigidbody. El Inspector le asigna player (el Player) y force (6). El script Player está listo: las flechas hacen caminar al jugador.
- En cada paso de física, empuja la roca hacia el jugador con
AddForce, con una fuerza deforce, tanto si el jugador está cerca como lejos. - Empújala solo por el suelo, sin componente hacia arriba ni hacia abajo, incluso cuando el jugador esté sobre el borde.
- No muevas su Transform ni congeles su rotación: la fricción la hace rodar.
Pulsa Play, corre en círculos alrededor de la roca y después pulsa Check.
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
}
}
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