Menu
CoddyTech

Persiga o jogador

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 52 de 71.

Um inimigo que persegue o jogador precisa de um Rigidbody, para que as paredes o parem e ele possa empurrar e ser empurrado. A perseguição em si é uma velocidade direcionada ao jogador, definida uma vez por etapa de física. Este zumbi caminha em direção ao que estiver no espaço player dele:

[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 aponta do zumbi para o jogador. O valor de y é definido como 0 para que o zumbi caminhe em terreno plano quando o jogador estiver mais alto ou mais baixo, e normalized faz com que seu comprimento seja 1, então o zumbi caminha a speed, esteja o jogador a 2 ou a 20 unidades de distância. A nova velocidade mantém a antiga velocidade em y, então a gravidade continua puxando o zumbi para baixo ao sair de um degrau. O Rigidbody está com Freeze Rotation ativado, então ele não tomba enquanto caminha.

Uma velocidade definida por você faz com que o inimigo comece a andar e vire de uma vez. Um inimigo pesado, como um barril rolante, é empurrado com AddForce no mesmo FixedUpdate: ele ganha velocidade, mantém o impulso e passa do ponto quando o jogador sai do caminho.

Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);

Evite mover o Transform de um perseguidor: isso o coloca dentro de uma parede com a mesma facilidade que em qualquer outro lugar, e o mecanismo de física só consegue empurrá-lo para fora depois.

challenge icon

Desafio

Médio

Faça a pedra rolar atrás do jogador.

  1. Em FixedUpdate(), defina Vector3 toPlayer = player.position - rb.position; e toPlayer.y = 0f;, para que o empurrão continue ao longo do chão.
  2. Chame rb.AddForce(toPlayer.normalized * force);, o mesmo empurrão de perto ou de longe. Deixe a rotação livre para que o atrito a faça rolar.

Pressione “Jogar” e corra em círculos ao redor da pedra. Depois, pressione “Verificar”.

Experimente você mesmo

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()
    {
        // empurre a pedra em direção ao jogador, ao longo do chão
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity