Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Um 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 bool chamado chasing indica se o lobo está perseguindo. Ele começa como false.
  • A cada passo da física, meça a distância até o jogador pelo chão (sem altura). Mais perto que noticeRange: chasing se torna true. Mais longe que giveUpRange: ele se torna false. Entre esses valores, permanece como está.
  • Enquanto persegue, o lobo corre em direção ao jogador a speed usando 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
    }
}
quiz iconTeste seus conhecimentos

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