Manual/ Primeros pasos

Prefabs

Objetos reutilizables: crear, instanciar, aplicar y usarlos desde Lua.

Un prefab es un objeto con sus hijos y componentes guardado como asset (.crprefab) para reutilizarlo: enemigos, farolas, puertas, monedas... Cada copia en una escena es una instancia enlazada a su prefab: si cambias el prefab, cambian todas.

Crear un prefab

  • Arrastra un objeto de la Jerarquía al panel Proyecto (al fondo o a una carpeta).
  • O clic derecho en la Jerarquía > Prefab > Crear prefab: se guarda en Assets/Prefabs.

El objeto pasa a ser la primera instancia del prefab y se ve en azul en la Jerarquía.

Poner copias en la escena

Arrastra el .crprefab a la Escena (cae en el suelo bajo el ratón), a la Jerarquía (como hijo del objeto donde lo sueltes) o haz doble clic en él.

Aplicar, revertir y cambios propios

Al elegir una instancia, el Inspector muestra la barra del prefab:

BotónQué hace
AplicarGuarda esta instancia como la nueva versión del prefab y actualiza todas las demás.
RevertirOlvida los cambios propios: queda igual que el prefab.
... > DesempaquetarQuita el enlace: quedan objetos normales.
... > Seleccionar todasSelecciona todas las instancias de ese prefab en la escena.

Lo que cambias en una instancia (un valor, un componente añadido o quitado, un hijo borrado) queda como cambio propio y se respeta cuando el prefab se actualiza. La posición, el giro y el nombre de la raíz son siempre de cada instancia. Pasa el ratón por "N cambios propios" para ver la lista.

Si cambias un prefab con una escena cerrada, sus instancias se ponen al día al abrirla (también en el juego exportado). Si borras el .crprefab, sus instancias siguen funcionando y salen en rojo en la Jerarquía.

Desde Lua

Crea instancias en el juego por la ruta del prefab dentro de Assets:

local Generador = { properties = { cada = 2.0 } }

function Generador:Start()
    self.t = 0
end

function Generador:Update(dt)
    self.t = self.t + dt
    if self.t >= self.cada then
        self.t = 0
        -- ruta dentro de Assets, con o sin .crprefab; posicion y giro (grados) opcionales
        local enemigo = Scene.instantiate("Prefabs/Enemigo", self.entity.position, Vec3(0, 180, 0))
        if enemigo == nil then Debug.log("No existe Prefabs/Enemigo") end
    end
end

return Generador

¿Algo no queda claro o falta algo? Pregunta en el Discord.