Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Spraw, by głaz toczył się za graczem.

  1. W FixedUpdate() ustaw Vector3 toPlayer = player.position - rb.position; i toPlayer.y = 0f;, aby pchnięcie działało wzdłuż podłoża.
  2. 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

Poćwicz samodzielnie: Edytor online Unity