Patrolować i gonić
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 52 z 63.
Strażnik patrolujący teren idzie wyznaczoną trasą, dopóki nie zauważy gracza, rusza za nim w pościg, a gdy gracz zniknie, wraca na trasę. Oba zachowania polegają na poruszaniu się w ten sam sposób, w stronę punktu, więc jedna metoda może obsługiwać ruch w obu przypadkach. Ten wartownik porusza się tam i z powrotem między dwoma punktami i ściga gracza, gdy ten znajduje się w zasięgu chaseRange:
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;
void Start()
{
rb = GetComponent<Rigidbody>();
goal = pointA;
}
void FixedUpdate()
{
if (Flat(player.position - rb.position).magnitude < chaseRange)
{
WalkTo(player.position);
return;
}
if (Flat(goal.position - rb.position).magnitude < 0.2f)
{
goal = goal == pointA ? pointB : pointA;
}
WalkTo(goal.position);
}
void WalkTo(Vector3 target)
{
Vector3 dir = Flat(target - rb.position).normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
Vector3 Flat(Vector3 v)
{
return new Vector3(v.x, 0f, v.z);
}Najpierw sprawdzany jest warunek rozpoczęcia pościgu, a instrukcja return pomija kod patrolu, więc pościg ma pierwszeństwo, gdy gracz jest blisko. goal jest polem, dlatego wartownik zachowuje jego wartość podczas pościgu: gdy gracz zniknie, wartownik idzie dalej do punktu, do którego zmierzał.
Warunek dotarcia mierzy odległość po ziemi. Punkty są znacznikami na podłodze, a środek wartownika znajduje się 1 jednostkę nad nimi, więc odległość uwzględniająca wysokość nigdy nie spadłaby poniżej 1 i wartownik nigdy by nie zawrócił. Warunek sprawdza, czy odległość jest mniejsza niż 0.2, a nie czy wynosi dokładnie 0: przy prędkości 2 jednostek na sekundę wartownik przemieszcza się o 0.04 jednostki na krok i prawie nigdy nie trafia dokładnie w punkt.
Wyzwanie
ŚredniRobot ochrony patroluje magazyn. Napisz skrypt Robot. Inspector przekazuje mu waypoints (cztery żółte znaczniki W0–W3, w kolejności), player, speed (4) i chaseRange (4). Skrypt Player jest gotowy.
- Pole
into nazwienext, zaczynające od 0, jest indeksem punktu trasy, do którego zmierza robot. - Patrol: idź do
waypoints[next]. Gdy robot znajdzie się w odległości mniejszej niż 0.2 od tego punktu, mierzonej po ziemi, przestawnextna kolejny punkt trasy, a po ostatnim wróć do 0. - Pościg: gdy gracz znajduje się bliżej niż
chaseRange, mierząc po ziemi, zamiast tego idź do gracza. - Gdy gracz się oddali, kontynuuj drogę do
waypoints[next], czyli punktu trasy, do którego zmierzał robot. - Poruszaj się, ustawiając prędkość Rigidbody na
speedwzdłuż ziemi i zachowując jego prędkość w osi y.
Naciśnij Play, poobserwuj jeden cykl patrolu i przetnij mu drogę, a następnie kliknij Check.
Spróbuj swoich sił
using UnityEngine;
public class Robot : MonoBehaviour
{
[SerializeField] private Transform[] waypoints;
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float chaseRange = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// ścigaj gracza, gdy jest blisko, w przeciwnym razie przemierzaj trasę patrolową
}
}
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