Ricerca…


Sintassi

  • oggetto statico pubblico PrefabUtility.InstantiatePrefab (Object target);
  • oggetto statico pubblico Object AssetDatabase.LoadAssetAtPath (string assetPath, Type type);
  • oggetto statico pubblico Object.Instantiate (oggetto originale);
  • public static Object Resources. Load (string path);

introduzione

Le prefabbricate sono un tipo di risorsa che consente di archiviare un GameObject completo con i suoi componenti, proprietà, componenti allegati e valori di proprietà serializzati. Ci sono molti scenari in cui questo è utile, tra cui:

  • Duplicazione di oggetti in una scena
  • Condivisione di un oggetto comune su più scene
  • Essere in grado di modificare una prefabbricazione una volta e applicando le modifiche su più oggetti / scene
  • Creazione di oggetti duplicati con modifiche minori, pur avendo gli elementi comuni modificabili da un prefabbricato di base
  • Creazione istantanea di GameObjects in fase di runtime

C'è una regola empirica in Unity che dice "tutto dovrebbe essere prefabbricato". Anche se questa è probabilmente un'esagerazione, incoraggia il riutilizzo del codice e la costruzione di GameObjects in un modo riutilizzabile, che è sia efficiente in termini di memoria che di buon design.

Creazione di prefabbricati

Per creare un prefabbricato, trascina un oggetto di gioco dalla gerarchia delle scene nella cartella o sottocartella Risorse :

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

Il nome dell'oggetto del gioco diventa blu, a indicare che è collegato a un prefabbricato .
Ora questo oggetto è un'istanza prefabbricata , proprio come un'istanza di un oggetto di una classe.

Un prefabbricato può essere cancellato dopo l'istanziazione. In tal caso il nome dell'oggetto di gioco precedentemente collegato diventa rosso:

inserisci la descrizione dell'immagine qui

Ispettore prefabbricato

Se selezioni un prefabbricato nella vista della gerarchia, noterai che l'ispettore è leggermente diverso da un normale oggetto di gioco:

inserisci la descrizione dell'immagine qui

vs

inserisci la descrizione dell'immagine qui

Le proprietà grassetto significano che i loro valori differiscono dai valori prefabbricati. È possibile modificare qualsiasi proprietà di un prefabbricato istanziato senza influire sui valori prefabbricati originali. Quando un valore viene modificato in un'istanza prefabbricata, diventa in grassetto e tutte le successive modifiche dello stesso valore nel prefabbricato non si rifletteranno nell'istanza modificata.

È possibile ripristinare i valori prefabbricati originali facendo clic sul pulsante Ripristina , il quale conterrà anche le modifiche dei valori nell'istanza. Inoltre, per ripristinare un singolo valore, puoi fare clic con il pulsante destro del mouse e premere Ripristina valore su Prefab . Per ripristinare un componente, fai clic con il pulsante destro del mouse e premi Ripristina prefabbricato .

Facendo clic sul pulsante Applica sovrascrive i valori delle proprietà prefabbricate con i valori delle proprietà dell'oggetto di gioco corrente. Non c'è il pulsante "Annulla" o conferma la finestra di dialogo, quindi mantieni questo pulsante con cura.

Seleziona pulsante evidenzia collegato prefabbricato nella struttura delle cartelle del progetto.

Prefabbricati istanziati

Esistono 2 modi di creare istanze prefabbricate: in fase di progettazione o in fase di esecuzione .

Creazione di istanze temporali

Istanziare i prefabbricati in fase di progettazione è utile per posizionare visivamente più istanze dello stesso oggetto (ad es. Posizionare alberi quando si progetta un livello del gioco ).

  • Per istanziare visivamente un prefabbricato trascinalo dalla vista del progetto alla gerarchia delle scene.

    inserisci la descrizione dell'immagine qui

  • Se stai scrivendo un'estensione editor , puoi anche creare un'istanza prefabbricata che chiama a PrefabUtility.InstantiatePrefab() programmazione il metodo PrefabUtility.InstantiatePrefab() :

    GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
    

Istanziazione runtime

Istanziare i prefabbricati in fase di esecuzione è utile per creare istanze di un oggetto secondo una logica (es. Generare un nemico ogni 5 secondi ).

Per istanziare un prefabbricato è necessario un riferimento all'oggetto prefabbricato. Questo può essere fatto avendo un campo public GameObject nel tuo script MonoBehaviour (e impostandone il valore usando l'ispettore nell'editor di Unity):

public class SomeScript : MonoBehaviour {
   public GameObject prefab; 
}

O inserendo il prefabbricato nella cartella Risorse e utilizzando Resources.Load . Resources.Load :

GameObject prefab = Resources.Load("Assets/Resources/MainCamera");

Una volta che hai un riferimento all'oggetto prefabbricato, puoi istanziarlo usando la funzione Instantiate qualsiasi punto del tuo codice (ad esempio all'interno di un loop per creare più oggetti ):

GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);

Nota: il termine prefabbricato non esiste in fase di esecuzione.

Prefabbricati annidati

I prefabbricati annidati non sono disponibili in Unity al momento. È possibile trascinare un prefabbricato in un altro e applicarlo, ma eventuali modifiche sul prefabbricato figlio non verranno applicate a quello annidato.

Ma c'è una soluzione semplice: devi aggiungere al genitore prefabbricato un semplice script, che istanzia un bambino.

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
        );
    }
}

Prefabbricato dei genitori:

Prefabbricato dei genitori

Prefabbricato per bambini:

Prefabbricato per bambini

Scena prima e dopo l'inizio:

Prima di iniziare inserisci la descrizione dell'immagine qui



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow