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.
Wyzwanie
ŚredniTa 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 ostrength(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;
}
}
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 mur