Persiga ao alcance
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 51 de 63.
A maioria dos inimigos deixa você em paz até você chegar perto. 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 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, e 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 sua borda entra e sai dele, e o slime começa e para repetidamente. Os inimigos evitam isso usando dois alcances: eles percebem o jogador dentro de um alcance curto e desistem apenas quando ele ultrapassa um alcance maior. Um bool lembra se o inimigo está perseguindo, e, entre os dois alcances, nada o altera, então o inimigo continua fazendo o que estava fazendo.
Desafio
MédioUm lobo caça na floresta. Escreva o script Wolf no lobo. O Inspector fornece player, speed (3), noticeRange (4) e giveUpRange (8). O script Player está pronto.
- Um campo
boolchamadochasingindica se o lobo está perseguindo. Ele começa comofalse. - A cada passo da física, meça a distância até o jogador pelo chão (sem altura). Mais perto que
noticeRange:chasingse tornatrue. Mais longe quegiveUpRange: ele se tornafalse. Entre esses valores, permanece como está. - Enquanto persegue, o lobo corre em direção ao jogador a
speedusando seu Rigidbody, mantendo sua velocidade y. Caso contrário, fica parado: velocidade x e z 0.
Pressione Play, aproxime-se do lobo e fuja, depois Check.
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()
{
// perceber o jogador, desistir de persegui-lo e persegui-lo ou ficar parado
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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çamento2Colisõ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
Colisores de gatilhoOnTriggerEnterItens coletáveisZonas de eliminaçãoEntrada 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 ao alcancePatrulhe e persigaVida e danoEmpurrãoRecapitulação: Cão de guarda