Gonienie gracza
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 52 z 71.
Wróg, który ściga gracza, potrzebuje komponentu Rigidbody, dzięki czemu ściany go zatrzymują, a on może pchać i być pchany. Samo ściganie polega na nadaniu mu prędkości skierowanej ku graczowi, ustawianej raz na krok fizyki. Ten zombie idzie w stronę obiektu przypisanego do pola player:
[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}player.position - rb.position wskazuje od zombie do gracza. Wartość y jest ustawiana na 0, aby zombie poruszał się po równym poziomie, gdy gracz stoi wyżej lub niżej, a normalized nadaje wektorowi długość 1, dzięki czemu zombie porusza się z prędkością speed, niezależnie od tego, czy gracz jest oddalony o 2 czy 20 jednostek. Nowa prędkość zachowuje poprzednią składową prędkości y, więc grawitacja nadal ściąga zombie w dół ze stopnia. W komponencie Rigidbody ma włączoną opcję Freeze Rotation, więc nie przewraca się podczas chodzenia.
Ustawiona prędkość sprawia, że poruszający się wróg od razu rusza i zmienia kierunek. Ciężkiego wroga, takiego jak tocząca się beczka, popycha się za pomocą AddForce w tym samym FixedUpdate: nabiera prędkości, zachowuje pęd i przelatuje za miejsce, gdy gracz zejdzie mu z drogi.
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);Unikaj przesuwania obiektu Transform ścigającego wroga: w ten sposób może on znaleźć się wewnątrz ściany tak samo łatwo, jak gdziekolwiek indziej, a silnik fizyki może go stamtąd wypchnąć dopiero później.
Wyzwanie
ŚredniSpraw, by głaz toczył się za graczem.
- W
FixedUpdate()ustawVector3 toPlayer = player.position - rb.position;itoPlayer.y = 0f;, aby pchnięcie działało wzdłuż podłoża. - Wywołaj
rb.AddForce(toPlayer.normalized * force);, aby siła pchnięcia była taka sama z bliska i z daleka. Pozostaw swobodny obrót, aby tarcie wprawiało głaz w ruch obrotowy.
Naciśnij „Graj” i biegaj dookoła głazu. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
public class Boulder : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float force = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// pchnij głaz po ziemi w stronę gracza
}
}
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