Gonić gracza
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 50 z 63.
Wróg, który goni gracza, potrzebuje komponentu Rigidbody, dzięki czemu ściany go zatrzymują, a on może popychać i być popychany. Samo gonienie polega na ustawianiu prędkości skierowanej ku graczowi, raz na krok fizyki. Ten zombie idzie w stronę tego, co znajduje się w jego polu 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, dzięki czemu zombie idzie po płaskim terenie, gdy gracz stoi wyżej lub niżej, a normalized nadaje wektorowi długość 1, więc 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 dotychczasową prędkość w osi y, więc grawitacja nadal ściąga zombie ze stopnia. Rigidbody ma włączoną opcję Freeze Rotation, więc zombie nie przewraca się podczas chodzenia.
Ustawiona prędkość sprawia, że przeciwnik zaczyna się poruszać i skręca od razu. Ciężkiego przeciwnika można zamiast tego popychać za pomocą AddForce w tym samym FixedUpdate: nabiera prędkości, zachowuje pęd i mija gracza, gdy ten odskoczy na bok. Unikaj przemieszczania komponentu Transform przeciwnika: w ten sposób może on znaleźć się w ścianie równie łatwo, jak gdziekolwiek indziej, a silnik fizyki może go stamtąd wypchnąć dopiero później.
Wyzwanie
ŚredniGłaz toczy się za graczem. Napisz skrypt Boulder dla głazu, czyli kuli z komponentem Rigidbody. Inspector przekazuje mu player (gracza) i force (6). Skrypt Player jest gotowy: strzałki poruszają graczem.
- Przy każdym kroku fizyki popychaj głaz w stronę gracza za pomocą
AddForce, z siłąforce, niezależnie od tego, czy gracz jest blisko, czy daleko. - Popychaj go tylko po ziemi, bez ruchu w górę ani w dół, nawet gdy gracz stoi na krawędzi.
- Nie przesuwaj jego Transform ani nie zamrażaj jego obrotu: tarcie sprawi, że będzie się toczył.
Naciśnij Play, biegaj dookoła głazu, a potem naciśnij Check.
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()
{
// popychaj głaz w stronę gracza, wzdłuż podłoża
}
}
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