Menu
CoddyTech

Gonić w zasięgu

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 51 z 63.

Większość wrogów zostawia cię w spokoju, dopóki się do nich nie zbliżysz. Mierz odległość do gracza w każdym kroku fizyki i ruszaj w pościg tylko w określonym zasięgu. Ten szlam ściga gracza w zasięgu sightRange, a poza nim stoi w miejscu:

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

Gałąź else ma znaczenie: Rigidbody zachowuje swoją prędkość, dopóki coś jej nie zmieni. Bez niej szlam, który straci cię z oczu, będzie sunął dalej, aż zatrzyma go tarcie, a na lodzie nie zatrzyma się nigdy. Ponieważ wcześniej ustawiono y na 0, toPlayer.magnitude to odległość po ziemi, więc gracz stojący na skrzyni obok szlamu nadal liczy się jako stojący obok niego.

Jeden zasięg ma słaby punkt. Gracz stojący na jego granicy raz znajduje się w jego obrębie, a raz poza nim, przez co szlam raz za razem zaczyna i przerywa pościg. Wrogowie unikają tego problemu, korzystając z dwóch zasięgów: zauważają gracza w krótszym zasięgu, a rezygnują z pościgu dopiero poza dłuższym. bool zapamiętuje, czy wróg ściga gracza, a w obszarze między tymi dwoma zasięgami jego wartość się nie zmienia, więc wróg kontynuuje to, co robił.

challenge icon

Wyzwanie

Średni

Wilk poluje w lesie. Napisz skrypt Wolf dla obiektu Wolf. W Inspectorze przypisz mu player, speed (3), noticeRange (4) i giveUpRange (8). Skrypt Player jest gotowy.

  • Pole typu bool o nazwie chasing określa, czy wilk goni gracza. Początkowo ma wartość false.
  • W każdym kroku fizyki zmierz odległość do gracza po ziemi (bez uwzględniania wysokości). Gdy odległość jest mniejsza niż noticeRange, chasing przyjmuje wartość true. Gdy jest większa niż giveUpRange, przyjmuje wartość false. Pomiędzy tymi wartościami zachowuje swoją dotychczasową wartość.
  • Gdy wilk goni gracza, biegnie w jego stronę z prędkością speed, używając komponentu Rigidbody i zachowując prędkość w osi y. W przeciwnym razie stoi w miejscu: prędkości w osiach x i z wynoszą 0.

Naciśnij Play, podejdź do wilka i zacznij uciekać, a następnie naciśnij Check.

Spróbuj swoich sił

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()
    {
        // zauważ gracza, przestań go ścigać i rusz w pościg albo stój w miejscu
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka