Menu
CoddyTech

Insegui nel raggio

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 51 di 63.

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

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 clausola else è importante: un Rigidbody mantiene la sua velocità finché qualcosa non la cambia. Senza di essa, uno slime che ti perde di vista continua a scivolare finché l'attrito non lo ferma, e sul ghiaccio non si ferma mai. Poiché y è stata impostata prima a 0, toPlayer.magnitude è la distanza sul terreno, quindi un giocatore in piedi su una cassa accanto allo slime risulta comunque accanto a lui.

Un unico raggio ha un punto debole. Un giocatore fermo sul suo limite entra e esce continuamente dal raggio, e lo slime parte e si ferma di continuo. I nemici evitano questo problema usando due raggi: notano il giocatore entro un raggio corto e rinunciano all'inseguimento solo 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 ciò che stava facendo.

challenge icon

Sfida

Medio

Un lupo caccia nella foresta. Scrivi lo script Wolf sul lupo. L'Inspector gli assegna player, speed (3), noticeRange (4) e giveUpRange (8). Lo script Player è pronto.

  • Un campo bool chiamato chasing indica se il lupo sta inseguendo. Inizia con false.
  • A ogni passo di fisica, misura la distanza dal giocatore sul terreno (senza altezza). Più vicino di noticeRange: chasing diventa true. Più lontano di giveUpRange: diventa false. Nel mezzo, rimane com'è.
  • Mentre insegue, il lupo corre verso il giocatore a speed usando il suo Rigidbody, mantenendo la velocità y. Altrimenti resta fermo: velocità x e z pari a 0.

Premi Play, avvicinati al lupo e scappa, poi Check.

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, poi inseguilo o resta fermo
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay