Patrol i pościg
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 54 z 71.
Strażnik patrolujący teren przemierza wyznaczoną trasę, aż 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 kierunku punktu, więc do obu można użyć jednej metody. Ten wartownik chodzi tam i z powrotem między dwoma posterunkami 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 wykonywany jest test pościgu, a instrukcja return pomija kod patrolowania, więc gdy gracz jest blisko, pościg ma pierwszeństwo. goal jest polem, więc wartownik pamięta jego wartość podczas pościgu: gdy gracz zniknie, idzie dalej w kierunku posterunku, do którego zmierzał.
Test dotarcia mierzy odległość po ziemi. Posterunki są znacznikami na podłodze, a środek wartownika znajduje się 1 jednostkę nad nimi, więc odległość uwzględniająca wysokość nigdy nie spadnie poniżej 1 i wartownik nigdy by się nie zawrócił. Test sprawdza, czy odległość jest mniejsza niż 0.2, a nie równa 0: przy prędkości 2 jednostek na sekundę wartownik przesuwa się o 0.04 jednostki na krok i prawie nigdy nie trafia dokładnie na posterunek.
Wyzwanie
ŚredniSpraw, by robot patrolował między punktami nawigacyjnymi i gonił gracza, który się zbliży.
- Napisz
WalkTo(Vector3 target), ustawiającrb.linearVelocityw jego kierunku wzdłuż podłoża z prędkościąspeedi zachowując jego prędkość w osi y. - W
FixedUpdate(), gdy gracz znajduje się bliżej niżchaseRange, wywołajWalkTo(player.position)ireturn. - W przeciwnym razie, gdy odległość od
waypoints[next]jest mniejsza niż 0.2, ustawnext = (next + 1) % waypoints.Length;, a następnie idź dowaypoints[next].
Naciśnij „Graj” i przetnij jego trasę. Następnie naciśnij „Sprawdź”.
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, a w przeciwnym razie przemierzaj trasę patrolową
}
}
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