Menu
CoddyTech

Pościg w zasięgu

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

Większość przeciwników zostawia cię w spokoju, dopóki się nie zbliżysz. Mierz odległość od gracza w każdym kroku fizyki i ścigaj go tylko w określonym zasięgu. Ten slime ściga gracza w zasięgu sightRange i stoi w miejscu poza nim:

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 slime, który straci cię z oczu, będzie się ślizgać, dopóki tarcie go nie zatrzyma, a na lodzie nie zatrzyma się nigdy. Ponieważ najpierw ustawiono y na 0, toPlayer.magnitude oznacza odległość po ziemi, więc gracz stojący na skrzyni obok slime’a nadal jest liczony jako stojący obok niego.

Jeden zasięg ma słaby punkt. Gracz stojący na jego granicy raz się do niego zbliża, a raz oddala, więc slime bez przerwy zaczyna i przerywa pościg. Przeciwnicy unikają tego dzięki dwóm zasięgom: zauważają gracza w krótszym zasięgu i rezygnują z pościgu dopiero po przekroczeniu dłuższego. bool zapamiętuje, czy przeciwnik ściga gracza, a w przestrzeni między tymi dwoma zasięgami nic się nie zmienia, więc przeciwnik kontynuuje to, co robił.

challenge icon

Wyzwanie

Średni

Spraw, by wilk zauważał gracza z bliska i rezygnował z pościgu z daleka.

  1. W FixedUpdate() oblicz płaską odległość od gracza: jeśli jest mniejsza niż noticeRange, ustaw pole bool chasing na true; jeśli jest większa niż giveUpRange, ustaw je na false.
  2. Podczas chasing ustaw rb.linearVelocity w kierunku gracza z prędkością speed, zachowując wartość y.
  3. W przeciwnym razie ustaw rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

Naciśnij „Graj”, podejdź do wilka i zacznij uciekać. Następnie naciśnij „Sprawdź”.

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ć, a następnie go ścigaj lub stój w miejscu
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity