unity3d
Prefabricados
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 :
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:
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:
vs
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.
Si está escribiendo una extensión de editor , también puede crear una instancia de un
PrefabUtility.InstantiatePrefab()
método dePrefabUtility.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:
Prefabricado infantil:
Escena antes y después del inicio: