unity3d
prefabbricati
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 :
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:
Ispettore prefabbricato
Se selezioni un prefabbricato nella vista della gerarchia, noterai che l'ispettore è leggermente diverso da un normale oggetto di gioco:
vs
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.
Se stai scrivendo un'estensione editor , puoi anche creare un'istanza prefabbricata che chiama a
PrefabUtility.InstantiatePrefab()
programmazione il metodoPrefabUtility.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 per bambini:
Scena prima e dopo l'inizio: