unity3d
Prefabrykaty
Szukaj…
Składnia
- public static Object PrefabUtility.InstantiatePrefab (obiekt docelowy);
- publiczny statyczny obiekt AssetDatabase.LoadAssetAtPath (ciąg assetPath, typ typu);
- public static Object Object.Instantiate (obiekt oryginalny);
- public static Object Resources.Load (ścieżka ciągu);
Wprowadzenie
Prefabrykaty to typ zasobu, który umożliwia przechowywanie pełnego GameObject z jego komponentami, właściwościami, dołączonymi komponentami i serializowanymi wartościami właściwości. Jest wiele scenariuszy, w których jest to przydatne, w tym:
- Powielanie obiektów w scenie
- Udostępnianie wspólnego obiektu w wielu scenach
- Możliwość jednorazowego zmodyfikowania prefabrykatu i wprowadzenia zmian w wielu obiektach / scenach
- Tworzenie zduplikowanych obiektów z niewielkimi modyfikacjami, przy jednoczesnym edytowaniu wspólnych elementów z jednego podstawowego prefabrykatu
- Tworzenie instancji GameObjects w czasie wykonywania
W Unity obowiązuje ogólna zasada: „wszystko powinno być prefabrykowane”. Chociaż jest to prawdopodobnie przesada, zachęca do ponownego użycia kodu i budowania GameObjects w sposób wielokrotnego użytku, który jest zarówno wydajny pod względem pamięci, jak i dobry projekt.
Tworzenie prefabrykatów
Aby utworzyć prefabrykat, przeciągnij obiekt gry z hierarchii scen do folderu lub podfolderu Assets :
Nazwa obiektu gry zmienia kolor na niebieski, co oznacza, że jest on połączony z prefabrykatem .
Teraz ten obiekt jest instancją prefabrykowaną , podobnie jak instancja obiektu klasy.
Prefabrykat można usunąć po utworzeniu wystąpienia. W takim przypadku nazwa wcześniej powiązanego z nim obiektu gry zmienia kolor na czerwony:
Inspektor prefabrykatów
Jeśli wybierzesz prefabryk w widoku hierarchii, zauważysz, że jego inspektor nieznacznie różni się od zwykłego obiektu gry:
vs
Pogrubione właściwości oznaczają, że ich wartości różnią się od wartości prefabrykowanych. Możesz zmienić dowolną właściwość instancji prefabrykatu bez wpływu na oryginalne wartości prefabrykatów. Gdy wartość zostanie zmieniona w instancji prefabrykowanej, zmieni się ona na pogrubioną, a wszelkie późniejsze zmiany tej samej wartości w prefabrykacie nie zostaną odzwierciedlone w zmienionej instancji.
Możesz przywrócić oryginalne wartości prefabrykowane, klikając przycisk Przywróć , co spowoduje również odzwierciedlenie zmian wartości w instancji. Ponadto, aby przywrócić pojedynczą wartość, możesz kliknąć ją prawym przyciskiem myszy i nacisnąć Przywróć wartość do prefabrykatu . Aby przywrócić komponent, kliknij go prawym przyciskiem myszy i naciśnij Przywróć do prefabrykatu .
Kliknięcie przycisku Zastosuj powoduje zastąpienie wartości właściwości prefabrytu bieżącymi wartościami właściwości obiektu gry. Nie ma przycisku „Cofnij” ani potwierdzania okna dialogowego, więc obchodź się z nim ostrożnie.
Przycisk Wybierz podświetla podłączony prefabrykat w strukturze folderów projektu.
Tworzenie prefabrykatów
Istnieją 2 sposoby tworzenia instancji prefabrykatów: w czasie projektowania lub w czasie wykonywania .
Tworzenie instancji czasu
Tworzenie instancji prefabrykatów w czasie projektowania jest przydatne do wizualnego umieszczania wielu instancji tego samego obiektu (np. Umieszczanie drzew podczas projektowania poziomu gry ).
Aby wizualnie utworzyć instancję, przeciągnij ją z widoku projektu do hierarchii scen.
Jeśli piszesz rozszerzenie edytora , możesz także utworzyć programowo prefabrykat wywołujący
PrefabUtility.InstantiatePrefab()
:GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
Instancja wykonawcza
Tworzenie instancji prefabrykatów w czasie wykonywania jest przydatne do tworzenia instancji obiektu zgodnie z pewną logiką (np. Odradzanie wroga co 5 sekund ).
Aby utworzyć wystąpienie prefabrykatu, potrzebujesz odwołania do obiektu prefabrykowanego. Można to zrobić poprzez public GameObject
pole MonoBehaviour
skrypcie MonoBehaviour
(i ustawienie jego wartości za pomocą inspektora w edytorze Unity):
public class SomeScript : MonoBehaviour {
public GameObject prefab;
}
Lub umieszczając prefabrykat w folderze Resource i używając Resources.Load
:
GameObject prefab = Resources.Load("Assets/Resources/MainCamera");
Gdy masz odwołanie do obiektu z prefabrykatów można instancję za pomocą Instantiate
funkcji w dowolnym miejscu w kodzie (np wewnątrz pętli do tworzenia wielu obiektów):
GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);
Uwaga: Termin prefabrykacji nie istnieje w czasie wykonywania.
Zagnieżdżone prefabrykaty
Zagnieżdżone prefabrykaty nie są obecnie dostępne w Unity. Możesz przeciągnąć jeden prefabrykat do drugiego i zastosować go, ale wszelkie zmiany w podrzędnym prefabrykacie nie zostaną zastosowane do zagnieżdżonego.
Istnieje jednak proste obejście - Musisz dodać do elementu nadrzędnego prosty skrypt, który utworzy instancję podrzędną.
using UnityEngine;
public class ParentPrefab : MonoBehaviour {
[SerializeField] GameObject childPrefab;
[SerializeField] Transform childPrefabPositionReference;
// Use this for initialization
void Start () {
print("Hello, I'm a parent prefab!");
Instantiate(
childPrefab,
childPrefabPositionReference.position,
childPrefabPositionReference.rotation,
gameObject.transform
);
}
}
Prefabrykat nadrzędny:
Prefabrykat dziecka:
Scena przed i po rozpoczęciu: