Persiga dentro do alcance
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 53 de 71.
A maioria dos inimigos deixa você em paz até você se aproximar. Meça a distância até o jogador em cada etapa da física e persiga-o apenas dentro de um determinado alcance. Este slime persegue o jogador dentro de sightRange e fica parado fora dele:
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
if (toPlayer.magnitude < sightRange)
{
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
else
{
rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
}
}O else é importante: um Rigidbody mantém sua velocidade até que algo a altere. Sem ele, um slime que perde você continua deslizando até que o atrito o pare; no gelo, ele nunca para. Como y foi definido como 0 primeiro, toPlayer.magnitude é a distância pelo chão, então um jogador em pé sobre uma caixa ao lado do slime ainda conta como estando ao lado dele.
Um único alcance tem um ponto fraco. Um jogador parado na borda dele entra e sai do alcance, e o slime começa e para repetidamente. Os inimigos evitam isso usando dois alcances: percebem o jogador dentro de um alcance curto e só desistem quando ele ultrapassa um alcance maior. Um bool lembra se o inimigo está perseguindo, e nada o altera entre os dois alcances, então o inimigo continua fazendo o que estava fazendo.
Desafio
MédioFaça o lobo perceber o jogador quando estiver por perto e desistir quando estiver longe.
- Em
FixedUpdate(), obtenha a distância plana até o jogador: se for menor quenoticeRange, defina o campobool chasingcomotrue; se for maior quegiveUpRange, defina-o comofalse. - Enquanto estiver
chasing, definarb.linearVelocityna direção do jogador, com velocidadespeed, mantendo o valor de y. - Caso contrário, defina
rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.
Pressione “Jogar”, aproxime-se do lobo e corra. Depois, “Verificar”.
Experimente você mesmo
using UnityEngine;
public class Wolf : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float speed = 3f;
[SerializeField] private float noticeRange = 4f;
[SerializeField] private float giveUpRange = 8f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// detecte o player, desista de persegui-lo e persiga-o ou fique parado
}
}
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