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ł.
Wyzwanie
ŚredniWilk 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
boolo nazwiechasingokreś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,chasingprzyjmuje 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
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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 startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterZnajdźkiStrefy śmierciWejście i wyjściePowtórka: klucz i drzwi6Raycasty
Physics.RaycastRaycastHitSprawdzanie podłoża za pomocą promieniaWarstwy i LayerMaskLinia widzeniaOverlapSphere i SphereCastPodsumowanie: laserowa bariera9Przeciwnicy
Gonić graczaGonić w zasięguPatrolować i gonićZdrowie i obrażeniaOdrzutPodsumowanie: pies stróżujący