Buscar..


Sintaxis

  • Public static Object PrefabUtility.InstantiatePrefab (Object target);
  • Objeto estático público AssetDatabase.LoadAssetAtPath (string assetPath, Tipo de tipo);
  • Objeto estático público Object.Instantiate (Objeto original);
  • Recursos de objetos estáticos públicos. Carga (ruta de cadena);

Introducción

Las casas prefabricadas son un tipo de activo que permite el almacenamiento de un GameObject completo con sus componentes, propiedades, componentes adjuntos y valores de propiedad serializados. Hay muchos escenarios donde esto es útil, incluyendo:

  • Duplicar objetos en una escena.
  • Compartiendo un objeto común a través de múltiples escenas
  • Poder modificar una prefabulación una vez y hacer que los cambios se apliquen a múltiples objetos / escenas
  • Crear objetos duplicados con modificaciones menores, mientras que los elementos comunes se pueden editar desde una base prefabricada
  • Instalar GameObjects en tiempo de ejecución

Hay una regla de oro de las clases en la Unidad que dice "todo debería ser Prefabs". Si bien esto probablemente sea exagerado, fomenta la reutilización del código y la creación de GameObjects de una manera reutilizable, que es a la vez eficiente en memoria y buen diseño.

Creación de prefabs

Para crear un prefab, arrastre un objeto del juego desde la jerarquía de la escena a la carpeta o subcarpeta de Activos :

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

El nombre del objeto del juego se vuelve azul, lo que indica que está conectado a una prefab .
Ahora este objeto es una instancia prefabricada , al igual que una instancia de objeto de una clase.

Un prefab puede ser eliminado después de la instanciación. En ese caso, el nombre del objeto del juego previamente conectado se vuelve rojo:

introduzca la descripción de la imagen aquí

Inspector prefabricado

Si selecciona una prefab en la vista de jerarquía, notará que su inspector se diferencia ligeramente de un objeto de juego normal:

introduzca la descripción de la imagen aquí

vs

introduzca la descripción de la imagen aquí

Las propiedades en negrita significan que sus valores difieren de los valores prefabricados. Puede cambiar cualquier propiedad de un prefab instanciado sin afectar los valores prefabricados originales. Cuando se cambia un valor en una instancia prefabricada, se pone en negrita y cualquier cambio posterior del mismo valor en la prefabricación no se reflejará en la instancia modificada.

Puede revertir a los valores prefabricados originales haciendo clic en el botón Revertir , que también reflejará los cambios de valor en la instancia. Además, para revertir un valor individual, puede hacer clic con el botón derecho y presionar Revertir valor en Prefab . Para revertir un componente, haga clic derecho y presione Revertir a Prefab .

Al hacer clic en el botón Aplicar se sobrescriben los valores de propiedad prefabricados con los valores de propiedad del objeto del juego actual. No hay un botón "Deshacer" o un cuadro de diálogo de confirmación, así que maneja este botón con cuidado.

Los botones de selección resaltan el prefab conectado en la estructura de carpetas del proyecto.

Creación de prefabs

Hay dos formas de crear una instancia de prefabs: durante el tiempo de diseño o en tiempo de ejecución .

Tiempo de diseño de instanciación

La creación de instancias prefabricadas en el momento del diseño es útil para colocar visualmente múltiples instancias del mismo objeto (por ejemplo, colocar árboles al diseñar un nivel de su juego ).

  • Para crear una instancia visual de un prefab, arrástrelo desde la vista del proyecto a la jerarquía de escenas.

    introduzca la descripción de la imagen aquí

  • Si está escribiendo una extensión de editor , también puede crear una instancia de un PrefabUtility.InstantiatePrefab() método de PrefabUtility.InstantiatePrefab() :

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

Instanciación en tiempo de ejecución

La creación de instancias prefabricadas en tiempo de ejecución es útil para crear instancias de un objeto de acuerdo con cierta lógica (por ejemplo, generar un enemigo cada 5 segundos ).

Para crear una instancia de una prefab, necesita una referencia al objeto prefabricado. Esto se puede hacer teniendo un campo de public GameObject en su script MonoBehaviour (y configurando su valor utilizando el inspector en el Editor de Unity):

public class SomeScript : MonoBehaviour {
   public GameObject prefab; 
}

O colocando el prefab en la carpeta de Recursos y utilizando Resources.Load . Resources.Load :

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

Una vez que tenga una referencia al objeto prefabricado, puede crear una instancia utilizando la función de Instantiate en cualquier parte de su código (por ejemplo, dentro de un bucle para crear múltiples objetos ):

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

Nota: El término prefabricado no existe en el tiempo de ejecución.

Prefabricados anidados

Los prefabs anidados no están disponibles en Unity en este momento. Puede arrastrar una prefabricada a otra, y aplicar eso, pero cualquier cambio en la prefabricación secundaria no se aplicará a una anidada.

Pero hay una solución simple: tiene que agregar a la prefab para padres una secuencia de comandos simple, que ejemplificará una para niños.

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

Padre prefabricado:

Padre prefabricado

Prefabricado infantil:

Niño prefabricado

Escena antes y después del inicio:

Antes de comenzar introduzca la descripción de la imagen aquí



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow