Unity3d QuickTip – czyli szybkie porady, rozwiązania częstych problemów i sztuczki w Unity3d!
Dzisiejszy odcinek: Jak zrobić odmierzanie czasu – timer
Uwaga! Jest to poradnik typu QuickTip. Zatem skupia się on na osiągnięciu założonego celu. Zatem zakładamy że użytkownik zna na tyle program Unity3d, aby samodzielnie wykonać najprostsze czynności, jak np. dodanie modelu kostki do sceny czy dodanie modelowi jakiegoś komponentu. Jeżeli brakuje Ci tej podstawowej wiedzy, zapraszam do tutoriala:
Unity Tutorial – Podstawy
Teoria
Często zdarza się, że potrzebujemy wykonać coś, po czym odczekać jakiś czas i wykonać kolejną rzecz. Normalnie w językach programowania dostajemy funkcję Sleep, jednak w Unity nie jest tak prosto, ale też nie jest to trudne. Do czego to wykorzystać? Np. możemy zamknąć automatyczne drzwi po paru sekundach od ich otwarcia, lub zniszczyć model łuski po naboju, by nie zalagowały nam gry.
Zaprezentuję wam dwa sposoby na zrobienie timera. Pierwszy prosty, stworzony z palca, a drugi będący współprogramem.
Timer ręczny
Sprawa jest bardzo prosta, bo opiera się na paru zmiennych i pętli.
using UnityEngine; using System.Collections; public class Timer : MonoBehaviour { private float timer = 0; void Update() { timer += Time.deltaTime; Debug.Log(timer); } }
#pragma strict public class Timer extends MonoBehaviour { var timer = 0 : float; function Update() { timer += Time.deltaTime; Debug.Log(timer); } }
Jak widać kod jest bardzo prosty. Mamy zmienną, która trzyma czas. Jedyną ciekawą rzeczą jest tutaj Time.deltaTime. Zmienna ta, to faktyczna zmiana czasu. Zwykłe dodanie np. 1, nie sprawdziłoby się, ponieważ gra ma swoją ilość klatek na sekundę, która nie jest stała i nasz czas, zależałby od prędkości komputera, oraz obciążenia procesora przez naszą grę. Time.deltaTime daje nam czas, jaki upłynął od wyrenderowania ostatniej klatki gry.
Teraz, aby zrobić coś po pewnym czasie, wystarczy dodać ifa, który wykona się, kiedy timer będzie >= od jakiegoś tam czasu. Kluczowe jest dodanie większe, ponieważ czas jest tutaj floatem i liczony jest z paroma miejscami po przecinku, więc jeśli ustawimy timer == 4, to warunek może nie zostać spełniony, bo po kolejnej inkrementacji, wartość może wynieść 4.005.
Timer poprzez współprogram
using UnityEngine; using System.Collections; public class Timer : MonoBehaviour { void Update() { StartCoroutine("waitFunction"); } IEnumerator waitFunction() { yield return new WaitForSeconds(2); } }
#pragma strict public class Timer extends MonoBehaviour { function Update() { StartCoroutine("waitFunction"); } function waitFunction() { yield new WaitForSeconds(2); } }
Jak widać, tutaj mamy aż dwie funkcje. Linijka zaczynająca się od yield, pozwala nam odczekać określoną liczbę sekund. Jednak należy zwrócić uwagę na fakt, iż w C# musi się on znaleźć wewnątrz funkcji zwracającej parametr IEnumerator.
Funkcję uruchamiamy przez funkcję StartCoroutine(“nazwaFunkcji”), stąd konieczność, umieszczenia całości w oddzielnej funkcji.
Oczywiście wewnątrz naszej funkcji waitFunction możemy umieścić więcej kodu. Np. wykonać jakieś operacje, odczekać jakiś czas funkcją yield, a następnie zrobić jeszcze jakieś operację.