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ł.
Wyzwanie
ŚredniSpraw, by wilk zauważał gracza z bliska i rezygnował z pościgu z daleka.
- W
FixedUpdate()oblicz płaską odległość od gracza: jeśli jest mniejsza niżnoticeRange, ustaw polebool chasingnatrue; jeśli jest większa niżgiveUpRange, ustaw je nafalse. - Podczas
chasingustawrb.linearVelocityw kierunku gracza z prędkościąspeed, zachowując wartość y. - 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
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa4Korutyny
WywoływanieInvokeRepeating i CancelInvokeTwoja pierwsza korutynaPętle w korutynachZatrzymywanie korutynPodsumowanie: odliczanie10Projekt: Ucieczka z areny
ArenaŁowcy2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur5Projekt: Wyścig po monety
Tocząca się piłkaZbieranie monet3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterPrzedmioty do zebraniaSkrzynie zatrzymują resztęStrefy śmierciWejście i wyjściePodsumowanie: klucz i drzwiPoćwicz samodzielnie: Edytor online Unity