sobota, 14 maja 2016

Komunikaty w grze

W grze może zaistnieć wiele sytuacji, w których powinien wyświetlić się jakiś komunikat. Przykładowo jeśli gracz wpisze niepoprawne hasło, to gra powinna go o tym powiadomić.

Pierwszym krokiem będzie utworzenie prefabu, który zawierałby komunikat. Będzie się on składał z obiektów:
- empty GameObject (pełniący rolę parenta następnych obiektów),
- UI/Image (pełniący rolę tła dla komunikatu),
- UI/Text (pełniący rolę tekstu komunikatu),
- UI/Button (pełniący rolę przycisku zamykającego komunikat).


Wszystkim obiektom nadajemy odpowiednie właściwości (skalę, pozycję itd,), a następnie wrzucamy w prefab i przechodzimy do tworzenia skryptów.

Komunikaty warto jest zrobić w taki sposób, aby mogły być wyświetlane z poziomu każdego skryptu i każdej sceny, a więc funkcję tworzącą komunikat warto jest zapisać w formie funkcji statycznej:

 static public void ShowMessage (string s) {
  GameObject Clone = Instantiate (Resources.Load ("PreMessage")) as GameObject;
  Clone.transform.parent = GameObject.Find ("Canvas").transform;
  GameObject MessageText = Clone.transform.Find ("MessageText").gameObject;
  MessageText.GetComponent <Text> ().text = s;

 }

Funkcja ta przyjmuje za argument string (ciąg znaków), który będzie treścią komunikatu. Pierwszą rzeczą robioną przez skrypt jest utworzenie instancji assetu "PreMessage" znajdującego się w folderze Resources, który zostaje przypisany do zmiennej Clone. Kolejną rzeczą jest znalezienie na scenie obiektu o nazwie "Canvas", a następnie ustalenie go jako parent dla naszego komunikatu. Canvas jest obiektem który jest wymagany do korzystania z obiektów UI (interfejsu użytkownika). Dotychczas Canvasa znajdywała się w prefabie ekranu logowania/rejestracji, co było wygodne, gdy był to jedyny UI w grze. Teraz moim zdaniem lepiej byłoby mieć na każdej scenie tylko jedną Canvasę i do niej przypinać wszystkie obiekty UI. Kolejną rzeczą wykonywaną przez skrypt jest znalezienie obiektu o nazwie "MessageText" (który w naszym przypadku jest obiektem tekstowym komunikatu), ale obiekt ten nie jest szukany na scenie, lecz w transformie naszej instancji, czyli jest szukany pośród childów naszego obiektu. Ostatnim elementem skryptu jest przypisanie wartości argumentu funkcji do komponentu tekstowego znalezionego obiektu. 

Potrzebny jest jeszcze jakiś skrypt, który powodowałby usunięcie komunikatu po naciśnięciu przycisku. Tworzymy więc nowy skrypt i dodajemy do niego publiczną funkcję, aby móc się do niej odwołać z komponentu przycisku. Skrypt można przypisać albo do przycisku, albo to jego ojca, a w zależności od wyboru inaczej trzeba będzie napisać skrypt. Jeśli będzie on przypisany do ojca przycisku, to wtedy skrypt będzie musiał zniszczyć obiekt, do którego jest przypisany:

 public void SelfDestroy () {
  Destroy (gameObject);
 }

Można też postąpić inaczej, czyli przypisać skrypt do przycisku, a wtedy skrypt też będzie musiał zniszczyć ojca przycisku, ale wtedy nie będzie to obiekt do którego jest przypisany skrypt, W takim przypadku funkcja będzie wyglądała tak:

 public void SelfDestroy () {
  Destroy (gameObject.transform.parent.gameObject);
 }

I na koniec należy dodać do przycisku odwołanie do tej funkcji, aby aktywowała się po kliknięciu na przycisk:

Brak komentarzy:

Prześlij komentarz