Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Faça o lobo perceber o jogador quando estiver por perto e desistir quando estiver longe.

  1. Em FixedUpdate(), obtenha a distância plana até o jogador: se for menor que noticeRange, defina o campo bool chasing como true; se for maior que giveUpRange, defina-o como false.
  2. Enquanto estiver chasing, defina rb.linearVelocity na direção do jogador, com velocidade speed, mantendo o valor de y.
  3. 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

Pratique por conta própria: Playground de Unity