Unity3d QuickTip – czyli szybkie porady, rozwiązania częstych problemów i sztuczki w Unity3d!

Dzisiejszy odcinek: Jak zrobić wyświetlanie podpowiedzi?

Teoria

Sprawa jest dość prosta więc nie będę się rozpisywał. W praktycznie każdej grze, mamy do czynienia z podpowiedziami wyświetlanymi na ekranie. Zakładam że każdy kojarzy sytuację, kiedy podchodzi do jakiegoś obiektu i pojawia się informacja “Naciśnij E aby podnieść”, lub coś w tym rodzaju. Dziś zajmiemy się wyświetleniem właśnie takiego tekstu!

Komunikat o zwycięstwie w grze Sanctum 2
Komunikat o zwycięstwie w grze Sanctum 2

Oczywiście jak widać na załączonym obrazku, taki tekst możemy wykorzystać na wiele sposobów.

Więc co będzie naszym celem? Stworzymy sobie collider. Po wejściu w niego ma się nam pojawić podpowiedź, która zniknie po pewnym czasie. Do dzieła!

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 – Podstawy 

Przygotowanie

Co będziemy potrzebowali żeby stworzyć nasze pole testowe?

  • Kontroler postaci, którą sterujemy
    Ja użyłem First Person Controllera, dostępnego ze standardowych assetów Unity. Można go zaimportować za pomocą [Asset -> Import Package -> Character Controller]
  • Jakiś dowolny obiekt (Ja użyłem zwykłej kostki (Cube)).
    Dla jej komponentu Collider musimy ustawić parametr isTrigger, oraz nieco zwiększyć jego rozmiar.
  • Podłoże po którym będziemy chodzić. U mnie znów jest to kostka.
  • Directional Light. Tylko po to żeby coś widzieć.
  • Dwa skrypty: U mnie TipDisplayer – przypisany do obiektu gracza, oraz TipCollider – przypisany do obiektu z Colliderem.
  • Oraz obiekt typu GUI Texture. Domyślnie ustawiamy mu wartość atrybutu Text na puste. Oraz ustawiamy jego pozycję na kamerze według naszych upodobań.

Wykonanie

Zaczniemy od kodu TipDisplayer’a. I od zdefiniowania zmiennych:

private bool showTip = false;
private float timer = 0;
public float tipTime = 5;
public GUIText tipGUI;

Szybkie wyjaśnienie. Zmienna showTip, odpowiada za pamiętanie czy podpowiedź ma się wyświetlić.  Timer to zmienna, którą sobie wykorzystamy wewnętrznie do odliczania czasu, do “zniknięcia” podpowiedzi. Zmienna tipTime, to czas, jak długo ma się wyświetlać podpowiedź. Jest publiczna żeby można było z poziomu Unity dostosować sobie ten czas. Ostatnia zmienna to tipGUI, która jest naszym obiektem typu GUIText. Teraz należy przejść do Unity, zaznaczyć nasz obiekt gracza i w pole zmiennej tipGUI przeciągnąć nasz dodany komponent GUIText, który dodaliśmy do sceny gry.

void displayTipMessage(string tipText) 
{
	tipGUI.text = tipText;
	tipGUI.enabled = true;
	this.showTip = true;
}

Teraz stworzymy funkcję, która komunikat wyświetli. Jak widać jako parametr przyjmuje zmienną tekstową, która będzie komunikatem. Odwołując się do naszej zmiennej tipGUI, ustawiamy wartość jej parametru text na otrzymaną przez funkcję. Następnie ustawiamy parametr enabled na true. Sprawia to że jeśli kontrolka byłby ukryta, pojawi się. Na koniec zmieniamy naszą zmienną na true, aby zakomunikować całemu skryptowi że mamy wyświetlić podpowiedź.

void Update () {
	if(showTip) {
		if(timer < tipTime) {
			timer += Time.deltaTime;
		} else {
			tipGUI.enabled = false;
			showTip = false;
			timer = 0;
		}
	}
}

Ostatni kod dodaliśmy w funkcji Update. Najpierw sprawdzamy czy wyświetlana jest jakaś podpowiedź. Jeśli jest to sprawdzamy czy nasz timer jest mniejszy od czasu maksymalnego wyświetlania się podpowiedzi. Jeśli tak jest, znaczy że powinna się jeszcze wyświetlać, ale by nie trwało to w nieskończoność dodajemy do kontrolki sekundę.

Możecie się zastanawiać czemu nie zrobiliśmy po prostu timer += 1 albo timer++. Odpowiedź jest prosta. Funkcja update wykonuje się co klatkę. Przez co dodawalibyśmy “sekundę” w każdej klatce. Czyli nasze 5 sekund trwało by 5 klatek. Przy odtwarzaniu 20 klatek na sekundę, jest to 1/4 sekundy. Do tego, nasze 5 sekund trwało by różny czas, w zależności od szybkości komputera, na którym gra jest uruchomiona. Raczej małe szansę że ktoś to przeczyta. Dlatego konstrukcja Time.deltaTime, pozwala dodać faktyczną sekundę, niezależną od klatek.

Jeżeli czas upłynął, (przechodzimy do tego co jest w else), chowamy nasz komponent GUIText, “ogłaszamy” skryptowi że nie wyświetlamy podpowiedzi przez zmianę kontrolki showTip na false, oraz zerujemy timer, aby był gotowy do użycia gdy nadejdzie kolejny komunikat do wyświetlenia.

Cały kod wygląda tak:

using UnityEngine;
using System.Collections;

public class TipDisplayer : MonoBehaviour {

	private bool showTip = false;
	private float timer = 0;
	public float tipTime = 5;
	public GUIText tipGUI;

	// Update is called once per frame
	void Update () {
		if(showTip) {
			if(timer < tipTime) {
				timer += Time.deltaTime;
			} else {
				tipGUI.enabled = false;
				showTip = false;
				timer = 0;
			}
		}
	}

	void displayTipMessage(string tipText) 
	{
		tipGUI.text = tipText;
		tipGUI.enabled = true;
		this.showTip = true;
	}

}

Czas na drugi plik, który przypisaliśmy do obiektu z Colliderem.

using UnityEngine;
using System.Collections;

public class TipCollider : MonoBehaviour 
{

	void OnTriggerEnter(Collider other) 
	{
		other.SendMessage("displayTipMessage", "Your Tip!");
	}
}

Jak widać tutaj kodu nie ma za dużo. Mamy funkcję OnTriggerEneter, która wykonuje się po wejściu w Collider z zaznaczoną opcją isTrigger. Co ważne wykonuje się on tylko w momencie wejścia. Zatem to że ktoś stoi dłużej wewnątrz Collidera, nie sprawi że tekst podpowiedzi będzie się wyświetlał w nieskończoność.

Jedyną linijką wewnątrz funkcji jest wykonanie funkcji SendMessage dla obiektu other. Zacznijmy od tego czym jest obiek other, który otrzymujemy jako parametr? Odpowiedź jest banalnie prosta, jest to obiekt, z którym weszliśmy w kolizję. (Musi posiadać Collider!).

Za to jak działa funkcja SendMessage? Jest to wysłanie komunikatu do obiektu o poszukiwanie pewnej funkcji. Można to zobrazować tak, że teraz TipCollider, mówi do obiektu other, że szuka funkcji “displayTipMessage”, oraz że chce ją wykonać z parametrem “Your Tip!”. Jeśli taką funkcję znajdziemy, zostanie ona wykonana. A jak ona wygląda wiemy z poprzednich części kodu.

I tak. To wszystko! Efekt powinien być następujący:

Efekt działania programu
Efekt działania programu

Podsumowanie

Dzisiaj zobaczyliście jak prosto i szybko zrobić prosty system wyświetlający podpowiedzi dla gracza. Oczywiście można system łatwo rozbudować przez np. dodanie możliwości, żeby każdy obiekt wysyłający prośbę o wyświetlenie komunikatu, sam decydował ile sekund ma się on wyświetlać.

Mam nadzieję że ten poradnik komuś się przydał i był dla was prostą i ciekawą lekcją. Jeśli macie jakieś pytania lub sugestię, zapraszam do komentowania.

Pobierz pliki – Kompletny projekt

[to_like] QucikTip1 – Marek Winiarski [/to_like]