Sök…


Syntax

  • public static Object PrefabUtility.InstantiatePrefab (Objektmål);
  • public static Object AssetDatabase.LoadAssetAtPath (string assetPath, Type type);
  • public static Object Object.Instantiate (Objekt original);
  • offentliga statiska objektresurser. Laddning (strängväg);

Introduktion

Prefabs är en tillgångstyp som tillåter lagring av ett komplett GameObject med dess komponenter, egenskaper, bifogade komponenter och seriella egendomsvärden. Det finns många scenarier där detta är användbart, inklusive:

  • Duplicera objekt i en scen
  • Dela ett gemensamt objekt över flera scener
  • Att kunna ändra en prefab en gång och att ändringarna gäller för flera objekt / scener
  • Skapa duplicerade objekt med mindre ändringar, samtidigt som de vanliga elementen kan redigeras från en basföre-prefab
  • Instantiating GameObjects vid körning

Det finns en tumregel i Unity som säger "allt ska vara Prefabs". Även om detta förmodligen är överdriven, uppmuntrar det till återanvändning av koder och byggandet av GameObjects på ett återanvändbart sätt, vilket är både minneseffektivt och bra design.

Skapa prefab

För att skapa en prefab drar du ett spelobjekt från scenhierarkin till mappen Tillgångar eller undermapp:

ange bildbeskrivning här

ange bildbeskrivning här

ange bildbeskrivning här

Spelobjektets namn blir blått, vilket indikerar att det är anslutet till en prefab .
Nu är detta objekt en prefab-instans , precis som en objektinstans av en klass.

En prefab kan raderas efter inställning. I så fall blir namnet på spelobjektet som tidigare anslutits till det rött:

ange bildbeskrivning här

Prefab inspektör

Om du väljer en prefab i hierarkivyn kommer du att märka att inspektören skiljer sig något från ett vanligt spelobjekt:

ange bildbeskrivning här

mot

ange bildbeskrivning här

Djärva egenskaper betyder att deras värden skiljer sig från prefab-värdena. Du kan ändra alla egenskaper i en instanserad prefab utan att det påverkar de ursprungliga prefabvärdena. När ett värde ändras i en prefab-instans blir det fetstil och eventuella efterföljande ändringar av samma värde i prefaben kommer inte att återspeglas i den ändrade instansen.

Du kan återgå till ursprungliga prefab-värden genom att klicka på Återställ- knappen, som också kommer att ändra värdeförändringar i förekomsten. För att återställa ett individuellt värde kan du högerklicka på det och trycka på Återställ värde för att förbereda . För att återställa en komponent, högerklicka på den och tryck på Återställ för att förbereda .

Om du klickar på Apply- knappen skrivs värden för prefabegenskaper över med de aktuella värden för spelobjektegenskaper. Det finns ingen "Ångra" -knapp eller bekräfta dialog, så hantera den här knappen med försiktighet.

Välj- knappen markerar ansluten prefab i projektets mappstruktur.

Instantiera prefab

Det finns två sätt att anpassa prefab: under designtid eller driftstid .

Institutionstid för designtid

Att inställa prefaber vid designtid är användbart för att visuellt placera flera instanser av samma objekt (t.ex. att placera träd när du utformar en nivå i ditt spel ).

  • För att visuellt instansera en prefab drar du den från projektvy till scenhierarki.

    ange bildbeskrivning här

  • Om du skriver en redaktörstillägg kan du också instansera ett prefab som programmerar PrefabUtility.InstantiatePrefab() :

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

Runtime instantiation

Instantiering av prefaber vid körning är användbart för att skapa förekomster av ett objekt enligt viss logik (t.ex. leka en fiende var 5: e sekund ).

För att instansera en prefab behöver du en referens till prefabobjektet. Detta kan göras genom att ha ett public GameObject fält i ditt MonoBehaviour skript (och ställa in dess värde med hjälp av inspektören i Unity Editor):

public class SomeScript : MonoBehaviour {
   public GameObject prefab; 
}

Eller genom att sätta prefaben i Resource- mappen och använda Resources.Load :

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

När du har en referens till prefabobjektet kan du instansera det med hjälp av funktionen Instantiate helst i din kod (t.ex. i en slinga för att skapa flera objekt ):

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

Obs: Prefab- termen finns inte vid körning.

Kapslade prefab

Kapslade prefabs är inte tillgängliga i Enhet för tillfället. Du kan dra en prefab till en annan och tillämpa det, men eventuella ändringar i underordet prefab tillämpas inte på kapslade.

Men det finns en enkel lösning - Du måste lägga till föräldrar prefab ett enkelt skript, som kommer att få ett barn ett.

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

Föräldrar prefab:

Föräldrar prefab

Barn prefab:

Barn prefab

Scen före och efter start:

Innan du börjar ange bildbeskrivning här



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow