Znam pewne różnice między Update() a FixedUpdate() i ostatnio używałem obu funkcji w jednym skrypcie. Kod działa, ale mam pytanie:

Czy używanie obu tych funkcji powoduje jakieś problemy? Czy używanie obu jest bezpieczne?

Odpowiedź

Zaktualizuj zamówienie

Kiedy śledzisz logikę gry i interakcje, animacje, pozycje kamery itp., możesz użyć kilku różnych zdarzeń. Typowym wzorcem jest wykonywanie większości zadań w funkcji Update, ale są też inne funkcje, których możesz użyć.

FixedUpdate:

FixedUpdate jest często nazywana częściej niż Aktualizacja.

Może być wywoływany wiele razy na klatkę, jeśli liczba klatek na sekundę jest niska, i może nie być wywoływana w ogóle między klatkami, jeśli liczba klatek jest wysoka. Wszystkie obliczenia i aktualizacje fizyki następują natychmiast po FixedUpdate. Podczas wykonywania obliczeń ruchu w programie FixedUpdate nie ma potrzeby mnożenia wartości przez Time.deltaTime.

FixedUpdate jest wywoływana przez niezawodny zegar, niezależnie od liczba klatek na sekundę

.

Aktualizacja:

Aktualizacja jest wywoływana raz na klatkę. Jest to główna funkcja służąca do aktualizacji ramek.

LateUpdate:

Funkcja LateUpdate jest wywoływana raz na klatkę po zakończeniu aktualizacji.

Wszelkie obliczenia wykonywane w programie Update zostaną zakończone, gdy rozpocznie się LateUpdate. Typowym zastosowaniem funkcji LateUpdate byłaby następująca kamera trzeciej osoby. Jeśli sprawisz, że twoja postać się poruszy i obrócisz w aktualizacji, możesz wykonać wszystkie obliczenia ruchu i obrotu kamery w LateUpdate. Zapewni to całkowite przesunięcie postaci, zanim kamera wyśledzi jej pozycję.

Jednoczesne używanie stałej aktualizacji, aktualizacji i późnej aktualizacji jest bezpieczne.

 using UnityEngine; using System.Collections; public class CheckFunctionExecutionOrder : MonoBehaviour { void FixedUpdate () { Debug.Log("FixedUpdate time :" + Time.deltaTime); } void Update () { Debug.Log("Update time :" + Time.deltaTime); } void LateUpdate() { Debug.Log("late Update time :" + Time.deltaTime); } } 

Komentarze

  • Doskonała odpowiedź! Warto dodać, że można utworzyć program, który czeka na FixedUpdate przed wykonaniem; uruchomienie tego programu z efektywnej metody startowej daje LateFixedUpdate (która, choć nie jest tak użyteczna, ma swoje zastosowania).
  • Mnożenie przez czas. deltaTime jest nadal dobrym pomysłem w FixedUpdate. Pozwala na wyrażanie takich rzeczy jak prędkość w " jednostkach na sekundę " zamiast " jednostek na takt " i jeśli zmienisz ustalony krok czasu, wygrywasz '. Nie musisz cofać się i ponownie dostrajać wszystkie parametry, aby uzyskać te same prędkości. Zaletą FixedUpdate jest to, że Time.deltaTime zawsze zwraca stabilny fixedDeltaTime, gdy uzyskuje się do niego dostęp z FixedUpdate, zamiast uzyskiwać zmienny wynik w każdej klatce w oparciu o liczbę klatek na sekundę i skalowanie czasu, tak jak dzieje się to w Aktualizacji. / div>

    Odpowiedź

    W rzeczywistości wszystkie działają w tym samym czasie, twoje skrypty po prostu wykonują te funkcje. Aktualizacja jest wywoływana raz na klatkę, a FixedUpdate jest wywoływana po każdej „aktualizacji fizyki” (co jest co określony czas, który możesz dostosować).

    Jest też LateUpdate , jeśli chcesz, aby pewne funkcje działały po funkcja Update tej ramki odniesienia. Pełną listę komunikatów można znaleźć w opisie MonoBehaviour .

    Tutaj znajduje się link do Samouczek Unity, który to obejmuje .

    Komentarze

    • Czy można kontrolować aktualizację fizyki? Chodzi mi o to, że jeśli ustawię Fixed TimeStep na jakąś wartość, to Naprawiona aktualizacja będzie działać po tym czasie? a fizyka gry również będzie działać po tym czasie?
    • @MuhammadFaizanKhan Tak powinno być. ' Nie jestem jednak pewien w obecnej wersji Unity, ale tak było, kiedy pisałem odpowiedź. Zasadniczo aktualizacja jest aktualizowana w każdej klatce, a fizyka ma własną liczbę klatek na sekundę i funkcję aktualizacji niezależną od innych funkcji aktualizacji.

    Odpowiedź

    Można bezpiecznie używać Update (), FixedUpdate () i LateUpdate () w jednym skrypcie. Przynajmniej mam i nigdy nie miałem żadnych problemów.Generalnie będę używał Update () do moich głównych pętli, FixedUpdate () do rzeczy takich jak fizyka i LateUpdate () do pętli, które chcę wykonać po wszystkim innym.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *