Menu
CoddyTech

Drgania kamery

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

Wstrząs to krótka seria losowych przesunięć: przez kilka dziesiątych sekundy kamera znajduje się w losowym punkcie blisko swojej pozycji spoczynkowej, na każdej klatce w nowym, a potem wraca. Pasuje tu coroutine, ponieważ działa przez wiele klatek i sama się kończy. Ta kamera drży, gdy głaz ląduje (inny skrypt wywołuje BoulderLanded(); plik zaczyna się od using System.Collections;, aby używać IEnumerator):

public float strength = 0.2f;
public float duration = 0.4f;
Vector3 rest;

void Start()
{
    rest = transform.localPosition;
}

public void BoulderLanded()
{
    StartCoroutine(Shake());
}

IEnumerator Shake()
{
    float elapsed = 0f;
    while (elapsed < duration)
    {
        transform.localPosition = rest + Random.insideUnitSphere * strength;
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.localPosition = rest;
}

Random.insideUnitSphere * strength to losowe przesunięcie o długości do strength w dowolnym kierunku, a yield return null wybiera nowe w następnej klatce. Dodawanie Time.deltaTime przy każdym przebiegu zlicza rzeczywisty czas w sekundach, więc wstrząs trwa duration niezależnie od liczby klatek na sekundę. Ostatnia linia przywraca kamerę; bez niej kamera pozostałaby tam, gdzie przesunęło ją ostatnie losowe przesunięcie.

Na każdej klatce Unity uruchamia wszystkie Update(), następnie coroutine oczekujące na yield return null, a potem wszystkie LateUpdate(). Dlatego kamera śledząca, która ustawia swoją pozycję w LateUpdate(), nadpisuje wszystko, co zrobił wstrząs. Wstrząsanie localPosition pozwala tego uniknąć, gdy kamera jest dzieckiem pustego obiektu, który śledzi obiekt: rodzic się porusza, a kamera drży wokół swojej pozycji względem niego.

challenge icon

Wyzwanie

Średni

Ta kamera podąża za graczem (strzałki nią poruszają): w LateUpdate() znajduje się w pozycji gracza plus offset i nie jest niczyim obiektem podrzędnym. Dodaj jej drganie, które działa podczas podążania:

  • Spacja wprawia ją w drgania przez duration (0.4) sekundy. W każdej klatce drgań kamera znajduje się w nowym, losowym miejscu, oddalonym maksymalnie o strength (0.3) od pozycji, w której podąża za graczem, jednocześnie nadal za nim podążając.
  • Gdy drgania się kończą, kamera wraca dokładnie do pozycji, w której podąża za graczem.

Spacja już uruchamia korutynę Shake(). Naciśnij Play, pobiegaj i naciśnij Spację, a następnie Check.

Spróbuj swoich sił

using System.Collections;
using UnityEngine;

public class ShakeFollow : MonoBehaviour
{
    public Transform player;
    public Vector3 offset = new Vector3(0, 4, -8);
    public float strength = 0.3f;
    public float duration = 0.4f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    void LateUpdate()
    {
        transform.position = player.position + offset;
    }

    IEnumerator Shake()
    {
        // Potrząsaj kamerą przez duration sekund, odchylając ją od pozycji, w której podąża za graczem, maksymalnie o strength.
        yield return null;
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka