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 :

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

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:

wprowadź opis zdjęcia tutaj

Inspektor prefabrykatów

Jeśli wybierzesz prefabryk w widoku hierarchii, zauważysz, że jego inspektor nieznacznie różni się od zwykłego obiektu gry:

wprowadź opis zdjęcia tutaj

vs

wprowadź opis zdjęcia tutaj

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.

    wprowadź opis zdjęcia tutaj

  • 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 rodzica

Prefabrykat dziecka:

Dziecko prefabrykowane

Scena przed i po rozpoczęciu:

Przed startem wprowadź opis zdjęcia tutaj



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow