Timer w Unreal przy użyciu C++

Jedna z wartości wyświetlanych na ekranie pochodzi ze zmiennej Time, która przechowuje czas pozostały do zakończenia gry. W innym artykule zobaczymy, jak wyrenderować inne wartości zmiennych na ekranie.

Zmienna Time zaczyna się od wartości 30. Potrzebujemy sposobu na zmniejszenie o 1 wartość tej zmiennej co sekundę. Aby to zrobić, stworzymy Timer. Timer umożliwia wykonanie funkcji po upływie określonego czasu. Funkcję tę można wykonać tylko raz lub okresowo.

Przed utworzeniem Timera będziemy potrzebować zmiennej typu FTimerHandle, która zostanie użyta do odniesienia do Timera, który zostanie utworzony. Konieczne będzie również stworzenie funkcji, która będzie wykonywana przez Timer. Funkcja ta będzie nosiła nazwę Clock().

Otwórz plik TutoProjectGameMode.h, umieść zmienną TimerHandleClock i deklarację funkcji Clock() w chronionym bloku poniżej funkcji BeginPlay(), jak pokazano poniżej.

...
protected:
	int32 PlayerLevel;

	int32 Score;

	int32 ItemCount;

	int32 Time;

	bool  bGameOver;

	virtual void BeginPlay() override;

	FTimerHandle TimerHandleClock;

	void Clock();
};

Uruchomiona gra ma menedżera timera, do którego można uzyskać dostęp za pomocą funkcji GetWorldTimerManager() w dowolnej podklasie AActor. Menedżer timera ma funkcję o nazwie SetTimer() używaną do tworzenia Timera.

Utworzenie Timera umieścimy wewnątrz funkcji StartGame(), która znajduje się w pliku TutoProjectGameMode.cpp. Funkcja StartGame() będzie miała następującą zawartość:

void ATutoProjectGameMode::StartGame()
{
  Score = 0;
  PlayerLevel = 1;
  ItemCount = 0;
  Time = 30;
  bGameOver = false;

  GetWorldTimerManager().SetTimer(TimerHandleClock, this, &ATutoProjectGameMode::Clock,
                                  1.0f, true);
}

Funkcja SetTimer() otrzymuje pięć parametrów, przeanalizujmy zatem wywołanie tej funkcji i każdy z dodanych parametrów:

  • GetWorldTimerManager().SetTimer(): Pierwszą rzeczą, która dzieje się w tej linii, jest wykonanie funkcji GetWorldTimerManager(), która zwraca instancję FTimeManager. Następnie wykonywana jest funkcja SetTimer() zwróconej instancji FTimeManager.
  • TimerHandleClock ; jest to pierwszy parametr funkcji SetTimer(). TimerHandleClock jest zmienną typu FTimerHandle, którą stworzyliśmy. Zostanie wypełniona niezbędnymi informacjami, abyśmy mogli później odwołać się do utworzonego timera.
  • This : To słowo kluczowe C ++, które odwołuje się do aktualnie uruchomionej instancji. Jest podobne do słowa Self używanego w Blueprints.
  • &ATutoProjectGameMode::Clock : W tym parametrze informujemy, która funkcja zostanie wykonana przez Timer. Zauważ, że przed identyfikacją funkcji znajduje się operator &. Ten operator służy do zwracania adresu pamięci funkcji. Identyfikacja funkcji składa się z nazwy klasy, operatora rozpoznawania zakresu :: i nazwy funkcji bez nawiasów.
  • 1.0f : Ten parametr wskazuje czas w sekundach, przez jaki zegar musi odczekać przed wykonaniem funkcji. To jest wartość zmiennoprzecinkowa. Przeanalizujemy typ float w innym artykule.
  • true : ten parametr logiczny to pętla. Jeśli prawda, wówczas Timer będzie wykonywał funkcję okresowo. Jeśli fałsz, funkcja zostanie wykonana tylko raz.

Funkcja SetTimer () jest odpowiednikiem węzła Blueprint o nazwie Set Timer by Function Name, który znajduje się na poniższym obrazku.

Musimy tylko zdefiniować funkcję Clock (), aby zakończyć nasz Timer. Dodaj poniższy kod na końcu pliku TutoProjectGameMode.cpp.

void ATutoProjectGameMode::Clock()
{
  if (Time > 0)
  {
    Time--;
  } 
  else
  {
    bGameOver = true;
    GetWorldTimerManager().ClearTimer(TimerHandleClock);
  }
}

Timer wykonuje funkcję Clock () raz na sekundę. Używamy warunku if, aby sprawdzić, czy wartość zmiennej Time jest większa od zera. Jeśli tak, to zmienna Time jest zmniejszana, czyli jej wartość zostanie kolejno zmniejszona o 1.

Jeśli wynikiem wyrażenia if jest false, zostanie wykonany blok else. W bloku else zmienna boolean bGameOver przyjmie wartość true, aby wskazać, że gra się zakończyła. Następnie wywoływana jest funkcja ClearTime(), aby zatrzymać utworzony przez nas Timer.


Źródło:https://romeroblueprints.blogspot.com/2020/08/creating-timer-in-unreal-c.html