Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Haz que la roca ruede detrás del jugador.

  1. En FixedUpdate(), establece Vector3 toPlayer = player.position - rb.position; y toPlayer.y = 0f;, para que el empuje se mantenga a lo largo del suelo.
  2. 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

Practica por tu cuenta: Playground de Unity