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.
Desafio
MédioFaça a pedra rolar atrás do jogador.
- Em
FixedUpdate(), definaVector3 toPlayer = player.position - rb.position;etoPlayer.y = 0f;, para que o empurrão continue ao longo do chão. - 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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar3Gatilhos
Colliders de gatilhoOnTriggerEnterItens coletáveisAs caixas ficam com o restoZonas mortaisEntrada e saídaRevisão: chave e porta6Raycasts
Physics.RaycastRaycastHitVerificação do chão com um raioCamadas e LayerMaskLinha de visãoOverlapSphere e SphereCastRecapitulação: armadilha a laser9Inimigos
Persiga o jogadorPersiga dentro do alcancePatrulhe e persigaVida e danoBalas que acertamEmpurrãoRevisão: Cão de guardaPratique por conta própria: Playground de Unity