środa, 9 marca 2016

Prefaby

Prefab jest to asset, w którym możemy przechowywać informacje o obiekcie wraz ze wszystkimi jego składowymi, czyli będą w nim przechowywane także wszystkie jego dzieci oraz komponenty. Prefaby najczęściej wykorzystuje się w celu tworzenia instancji (kopii) jego zawartości na scenie.

Tworzenie prefabów jest proste: najpierw w oknie Unity wybieramy opcje Assets->Create->Prefab, nadajemy temu obiektowi nazwę, a następnie wybieramy interesujący nas obiekt znajdujący się na scenie (najlepiej w oknie hierarchii) i przeciągamy ten obiekt do dopiero utworzonego assetu.

Gdy stworzymy prefab, możemy przeciągnąć go na scenę, aby utworzyć jego instancję. Wszystkie instancje tego prefabu są z nim powiązane, dzięki czemu podmiana dowolnej właściwości w prefabie powoduje automatyczną zmianę tej właściwości we wszystkich jego instancjach. Przykładowo dodanie do prefabu skryptu spowoduje, że wszystkie jego instancje także zyskają ten skrypt. Nie działa to w drugą stronę – modyfikacja jednej instancji nie powoduje modyfikacji prefabu oraz jego innych instancji. Dzięki tej właściwości możemy np. ustawić wiele tych samych obiektów w różnych miejscach na mapie (ponieważ nie będą miały wspólnej pozycji). Dodatkowo jeśli zmodyfikujemy jakiś fragment instancji, to później modyfikacja tego samego elementu w prefabie nie będzie powodowała zmiany wcześniej zmodyfikowanego fragmentu. Przykładowo jeśli zmodyfikujemy skalę kilku instancji, to potem modyfikując skalę prefabu nie utracimy naszej dotychczasowej pracy.

Instancje z poziomu kodu

Instancje prefabów można także tworzyć z poziomu kodu za pomocą wbudowanej funkcji Instantiate o następujących argumentach:
 Instantiate (Object original, Vector3 position, Quaternion rotation);
 Instantiate (Object original);
Pierwszy schemat korzysta z 3 argumentów: obiektu, pozycji, oraz rotacji. Drugi schemat jest skróconą wersją pierwszego. Jako obiekt przyjmujemy obiekt który chcemy skopiować, czyli przeważnie prefab. Pozostałe 2 argumenty określają w jaki sposób obiekt ma być ustawiony na scenie. Jeśli nie podamy 2 ostatnich argumentów, to jako pozycję i rotację przyjmowana jest standardowa pozycja i rotacja naszego prefabu.

Co zrobić, aby przekazać nasz prefab do funkcji Instantiate? Istnieje na to wiele różnych sposobów, ale omówię tutaj 2 z nich:
Pierwszym ze sposobów jest utworzenie w klasie skryptu publicznej zmiennej typu GameObject, dzięki czemu będzie ona widoczna w inspektorze Unity i będziemy mogli ustalić wartość tej zmiennej z poziomu edytora Unity, dzięki czemu nasza zmienna będzie zawierała odwołanie się do naszego prefabu. Warto jednak pamiętać, że jeśli zapomnimy przypisać prefab do zmiennej (co może się zdarzyć, jeśli mamy na scenie wiele różnych obiektów), to uruchomiony program nie będzie tworzył instancji tej zmiennej, tylko zwróci informację o błędzie i przerwie funkcję skryptu.
Drugim sposobem jest odwołanie się w kodzie bezpośrednio do assetów naszej gry, co możemy dokonać następującym fragmentem kodu:
 Resources.Load ("NazwaAssetu")
Warto pamiętać, że kod ten zadziała tylko wtedy, gdy nasz asset znajduje się w folderze o nazwie „Resources”.

Dla mnie drugi sposób jest wygodniejszy, ponieważ nie musimy przejmować się ciągłym przypisywaniem zmiennych z poziomu edytora.

Brak komentarzy:

Prześlij komentarz