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