Menu
CoddyTech

Inseguire a portata

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 53 di 71.

La maggior parte dei nemici ti lascia in pace finché non ti avvicini. Misura la distanza dal giocatore a ogni passo della fisica e inseguilo solo entro un certo raggio. Questo slime insegue entro sightRange e resta fermo al di fuori di esso:

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);
    }
}

La parte else è importante: un Rigidbody mantiene la sua velocità finché qualcosa non la modifica. Senza questa parte, uno slime che ti perde di vista continua a scivolare finché l'attrito non lo ferma, e sul ghiaccio non si ferma mai. Poiché prima abbiamo impostato y su 0, toPlayer.magnitude è la distanza sul terreno, quindi un giocatore in piedi su una cassa accanto allo slime è comunque considerato accanto a lui.

Un solo raggio ha un punto debole. Un giocatore fermo sul suo bordo entra e esce dal raggio, e lo slime continua ad avviarsi e fermarsi. I nemici evitano questo problema usando due raggi: notano il giocatore entro un raggio breve e rinunciano solo quando è oltre un raggio più ampio. Un bool ricorda se il nemico sta inseguendo e, tra i due raggi, nulla lo modifica, quindi il nemico continua a fare quello che stava facendo.

challenge icon

Sfida

Medio

Fai in modo che il lupo noti il giocatore da vicino e rinunci quando è lontano.

  1. In FixedUpdate(), calcola la distanza sul piano dal giocatore: se è inferiore a noticeRange, imposta il campo bool chasing su true; se è superiore a giveUpRange, impostalo su false.
  2. Quando chasing è attivo, imposta rb.linearVelocity verso il giocatore alla velocità speed, mantenendo il valore y.
  3. Altrimenti imposta rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

Premi «Gioca», avvicinati al lupo e poi scappa. Quindi premi «Verifica».

Provalo tu

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()
    {
        // individua il player, rinuncia a inseguirlo e inseguilo oppure resta fermo
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity