Menu
CoddyTech

Płynne podążanie

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 47 z 71.

Kamera, która w LateUpdate() kopiuje pozycję gracza i dodaje przesunięcie, sprawia, że każde szarpnięcie gracza powoduje szarpnięcie widoku. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) zwraca pozycję przesuniętą w stronę target tak, jak porusza się tłumiona sprężyna: przyspiesza, zwalnia w miarę zbliżania się do celu i dociera do niego bez przekroczenia. Ta kamera podąża za graczem z pozycji 3 jednostki wyżej i 6 jednostek za nim, z niewielkim opóźnieniem:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref przekazuje SmoothDamp samą zmienną zamiast jej kopii, dzięki czemu metoda może ją zmienić. SmoothDamp zapisuje w velocity aktualną prędkość kamery na wszystkich trzech osiach i potrzebuje jej ponownie w następnej klatce, dlatego jest to pole. Gdyby zmienna była zadeklarowana wewnątrz LateUpdate(), w każdej klatce zaczynałaby od zera, a kamera poruszałaby się bardzo powoli — o około pół procenta drogi na klatkę. W przypadku pojedynczej liczby, takiej jak powiększenie kamery, Mathf.SmoothDamp działa tak samo, używając prędkości typu float.

smoothTime określa, jak duże jest opóźnienie kamery: przy wartości 0.3 w ciągu 0.3 sekundy pokonuje około 60% nagłego skoku, a po 1 sekundzie jest już prawie na miejscu. Mniejsza wartość oznacza ściślejsze podążanie. SmoothDamp sam odczytuje Time.deltaTime, więc w wywołaniu niczego nie mnoży się przez tę wartość.

challenge icon

Wyzwanie

Średni

Spraw, aby kamera płynnie podążała za graczem ze stałej wysokości.

  1. Dodaj pole Vector3 velocity;.
  2. W LateUpdate() utwórz Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, aby skok nie poruszał widokiem.
  3. Ustaw transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

Naciśnij „Graj”, pobiegaj i podskocz: kamera lekko podąża za graczem i nigdy nie podskakuje. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // Płynnie przesuwaj się w stronę punktu nad graczem (x), oddalonego od niego o back jednostek do tyłu (z), na stałej wysokości.
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity