Prefabs y edición múltiple
Los prefabs convierten una jerarquía GameObject en contenido de proyecto reutilizable. La edición múltiple aplica el mismo cambio seguro a varios GameObjects seleccionados. Juntos son la forma recomendada de construir puertas repetidas, luces, configuraciones de interacción, módulos de entorno y accesorios de juego sin mantener copias desconectadas.
Selecciona más de un GameObject
Usa el Hierarchy para crear una selección:
- Ctrl-click agrega o elimina un GameObject.
- Shift-click selecciona el rango contiguo del anclaje de selección.
- Al hacer clic sin un modificador se reemplaza la selección actual.
El Inspector muestra valores mixtos cuando los objetos tienen valores diferentes. Editar Position, Rotation o Scale aplica el valor introducido a cada GameObject seleccionado. Enable All y Disable All actualizan el estado activo como una sola operación que se puede deshacer.
Cuando todos los GameObjects seleccionados tienen el mismo componente compatible, la sección Batch Components permite activarlo o desactivarlo para toda la selección. Los controles por lote actuales incluyen Player Input, Player Motor, Interactable y Camera Rig. Add Collider to Missing agrega un Collider ajustado solo donde todavía no existe.
Duplicate Selected y Delete Selected operan en raíces de selección. Si se seleccionan tanto un padre como su hijo, la jerarquía se procesa una vez desde el padre. Duplicate vuelve a asignar las referencias internas de GameObject para que los subárboles copiados continúen refiriéndose a sus miembros copiados.
Crear un Prefab
- Selecciona la raíz de la jerarquía que desea reutilizar.
- Haz clic derecho en el Hierarchy y elige Create Prefab....
- Introduce un nombre de recurso válido.
- Guarda la escena.
El editor escribe Assets/Prefabs/<name>.prefab.json. La jerarquía seleccionada se convierte en una instancia enlazada inmediatamente. Un prefab almacena el subárbol completo con ID locales estables, lo que permite al editor conservar las referencias entre sus hijos cuando se instancia o sincroniza.
Instanciar un Prefab
Busca el prefab en Assets/Prefabs en Project Browser y arrástralo:
- en la raíz de escena para crear una instancia raíz; o
- en un GameObject para crear una instancia hijo.
La nueva jerarquía recibe los ID GameObject únicos de la escena mientras conserva su identidad local prefab. El Inspector muestra la ruta de origen y las acciones prefabs para la raíz de la instancia y sus hijos.
Sincronizar, aplicar y desempaquetar
| Medidas adoptadas | Resultados |
|---|---|
| Sync / Sync from Source | Reconstruye la instancia a partir del prefab de origen y conserva el Transform de su raíz y los valores sobrescritos de las propiedades expuestas de Lua. |
| Apply / Apply to Source | Escribe atómicamente la jerarquía de instancias seleccionada en el recurso prefab. Otras instancias se actualizan cuando están sincronizadas. |
| Unpack | Elimina el enlace prefab pero mantiene la jerarquía GameObject completa en la escena. |
Usa Sync después de cambiar un prefab desde otra instancia o actualizarlo desde el repositorio. Usa Apply solo cuando la instancia seleccionada represente el contenido reutilizable que quieres guardar en el origen. Usa Unpack cuando una copia deba mantenerse independiente.
La posición de la raíz configurada para cada escena no se obtiene del prefab durante la sincronización. Los valores expuestos de Lua en la raíz de la instancia también se conservan, por lo que el comportamiento reutilizable puede ajustarse para cada instancia.
Sync limpia las referencias a miembros eliminados del prefab y conserva la posición en el mundo de los hijos agregados localmente cuando deben cambiar de padre. Si cambió la identidad de la raíz del origen, vuelve a instanciar el prefab o desempaqueta la instancia anterior en lugar de forzar la sincronización. Un padre con escala cero que impida cambiar de padre de forma segura también bloquea la operación sin modificar la escena. Apply valida la jerarquía candidata antes de reemplazar el archivo del prefab.
Mover o eliminar un prefab
Mover un prefab dentro del navegador Project actualiza los enlaces en las escenas del proyecto, incluidas las de subcarpetas, y en otros documentos prefab. La eliminación de un prefab incluye estas protecciones:
- el editor carga el prefab antes de la eliminación;
- cada escena creada se escanea en busca de instancias vinculadas;
- las instancias vinculadas se desempaquetan sin eliminar sus GameObjects;
- los archivos de escena afectados se escriben transaccionalmente; y
- la operación se revierte si falla la actualización de alguna escena que lo referencia.
Los cambios de referencias se preparan juntos antes de reemplazar los archivos. Si una escena o un prefab no se puede leer o actualizar, corrige ese archivo y vuelve a intentarlo; el editor no lo omite dejando referencias desactualizadas.
Esto protege el contenido de la escena, pero el control de versiones sigue siendo la forma de recuperar un cambio o una eliminación no deseada después de que la transacción termine correctamente.
Flujo de trabajo recomendado
- Mantén un prefab enfocado en una responsabilidad reutilizable.
- Ponga valores intencionales por instancia en las propiedades expuestas de Lua en lugar de editar la estructura prefab en cada escena.
- Aplicar desde una instancia representativa revisada y, a continuación, sincronizar otras instancias.
- Validar el proyecto después de mover, renombrar o eliminar contenido compartido.
- Guarda los cambios del prefab y de la escena en el mismo commit para mantener sus enlaces coherentes para otros desarrolladores.
Deshacer y metadatos de escena
Las instantáneas de Undo/Redo de la escena incluyen niebla, presentación de carga, lienzos, líneas de tiempo, animaciones y datos de objetos. Recorrer el historial de ediciones de objetos no debe descartar metadatos de la escena que no estén relacionados. Level Builder tiene su propio historial de malla; Undo/Redo del menú Edit y de la barra de herramientas actúan sobre él cuando ese espacio de trabajo tiene el contexto de edición. Ctrl+S guarda los datos de escena y proyecto, los ajustes de importación pendientes y las mallas de Level Builder modificadas.