Skip to content

Qué son los Prefab en Unity 3D

A la hora de construir una escena en Unity, es importante conocer de manera detallada que elementos intervienen, implementando toda la lógica del videojuego que se va a desarrollar. Como parte clave para la construcción de una escena, Unity nos proporciona dos elementos que permiten añadir objetos a la misma:

  • Mediante la instanciación (creación) de objetos reutilizables desde los recursos del proyecto, es decir, un Prefab
  • Mediante la construcción libre de un objeto, que cumpla con las características demandadas por su rol en el videojuego, es decir, un GameObject construido a partir de componentes de diferente complejidad

En este tutorial describiremos, a  través de un ejemplo básico, la utilización de GameObjetcs y Prefabs dentro de una escena de Unity 3D. Incluimos también dos breves videos donde mostraremos detalles del proceso y el resultado final en el juego, y en la siguiente publicación, veremos todo ello en un video más extenso.

Antes de entrar en ese ejemplo recordaremos las características básicas de un GameObject y definiremos el elemento Prefab en más detalle.

GameObject

Son uno de los elementos indispensables en el desarrollo de videojuegos con Unity, ya que representan cualquier objeto situado en la escena del juego.

Ya explicamos en anteriores tutoriales, que para entender en qué consiste un GameObject, basta con definirlo como un contenedor, que almacenará diferentes elementos que se encargan de establecer su funcionalidad, y a cuyos elementos denominamos componentes. Dependerá en gran medida de los componentes que se implementen en el GameObject para construir la lógica del mismo en la escena.

Todo GameObject estará formado por defecto por los siguientes elementos:

  1. Nombre del GameObject en la escena (junto a un checkbox para habilitar o no este objeto en el juego).
  2. Tag que permita identificar el objeto programáticamente, además de agrupar elementos que definan características similares.
  3. Layer, que proporciona un desplegable donde se especifica la capa donde se representará el objeto.
  4. Componente Transform, que describe la posición (coordenadas X,Y,Z), rotación (en grados alrededor del eje X,Y,Z) y escala (tamaño del objeto, que al definir valor 1, indica que es el tamaño original) del objeto en la escena.
  5. Propiedad Static (checkbox), que permite especificar si un objeto se moverá o no a lo largo del escenario.

En la siguiente imagen se puede apreciar la estructura de un GameObject vacío, que podrá añadirse a la jerarquía de objetos a través del menú GameObject > Create Empty (en versiones anteriores a Unity 5.0: GameObject > GameObject Empty):

GameObject vacio

Además de los componentes y propiedades que intervienen en todo GameObject, recordamos algunas de sus características básicas:

  • Es posible desactivar un GameObject, afectando por igual a todos los elementos hijos de éste.
  • El uso de un tag asignado al GameObject, permite vincular a varios objetos entre sí que implementen características similares (un ejemplo muy común son los tags «Player» o «Enemy», para identificar los personajes que manejará el usuario o los enemigos representados en el videojuego, respectivamente).
  • Los componentes asignados a cada GameObject proporcionan su comportamiento y funcionalidad en la lógica del juego.
  • Todo GameObject creado tiene un componente Transform, que habilita un concepto denominado parenting, en el que un GameObject será hijo de otro, heredando el movimiento y la rotación del objeto padre.

 

Prefab

Los prefabs son objetos reutilizables, y creados con una serie de características dentro de la vista proyecto, que serán instanciados en el videojuego cada vez que se estime oportuno y tantas veces como sea necesario. Es decir, nos permiten crear ‘copias’ fácilmente con una serie de ventajas:

  • Es posible diferenciar qué objetos están conectados a un prefab desde la jerarquía de objetos (resaltados en color azul).
  • Permite modificar los valores de un elemento del prefab instanciado, no afectando al resto de instancias implementadas, y sin romper la conexión con el prefab creado en los recursos del proyecto.
  • Si se modifican las propiedades del prefab creado, y este es instanciado en diferentes zonas de la escena, los cambios realizados afectarán a todas las instancias implementadas, sin necesidad de tener que modificar de manera individual cada instancia.

Creación de un prefab

En este apartado, y a través de un ejemplo en el que un usuario manejará en tercera persona un personaje creado con objetos primitivos, se mostrará el proceso de creación de un prefab y su instanciación dentro de la escena simulando el lanzamiento de proyectiles a lo largo del escenario. Para ello se necesitarán los siguientes elementos:

  • GameObject primitivo de tipo esfera que simulará el lanzamiento de proyectiles desde su posición (este será el personaje que maneje el usuario en tercera persona).
  • GameObject Terrain para posicionar el personaje del jugador en una superficie.
  • GameObject Directional Light para iluminar la escena del juego.
  • GameObject Camera para representar la vista del juego en tercera persona.
  • Dos scripts que permitan instanciar y destruir el prefab creado en los recursos del proyecto (es necesario destruir cada prefab instanciado para preservar los recursos utilizados por el juego).
  • Prefab construido a partir de un GameObject Sphere creado en la escena.
  • GameObject vacío, que además del componente Transform, implemente el script «InstanciarProyectil», para simular el lanzamiento de proyectiles por parte del personaje del jugador.

Pasos para la creación del prefab «Proyectil»

En primer lugar, se creará un GameObject primitivo de tipo Sphere en la jerarquía de objetos de la escena, que servirá como modelo para la creación del prefab. A los componentes por defecto que podrán visualizarse en la ventana inspector del objeto, se deberá añadir un componente Rigidbody (componente de Unity que se verá afectado por el motor de físicas), y un script que permita destruir el proyectil pasado un determinado tiempo.

Vemos el código de este sencillo script «DestruirProyectil«, incluido dentro del GameObject de tipo Sphere creado:

En el script:

  • Se declara una variable miembro de tipo public para indicar el tiempo que tardará en destruirse la instancia del objeto «Proyectil»: public float tiempoDestruir; 
  • Como se puede apreciar se define el método Start, ( void Start() {...}  ) que será invocado en el primer frame antes del inicio del juego y al activar el script.
    En su interior se llama al método Destroy, recibiendo como argumentos el objeto a destruir (en este caso el objeto que incluye este script), y el tiempo que tardará en destruirse dicho objeto:  Destroy(this.gameObject, tiempoDestruir);

Desde el editor de Unity se podrá visualizar de la siguiente forma el script «DestruirProyectil», junto con el resto de componentes del GameObject «Proyectil»:

Inspector Proyectil

Una vez añadido este GameObject a la escena, se creará un prefab dentro de la ventana Project, con tan sólo pulsar el botón derecho del ratón y seleccionar el menú Create > Prefab. Esto hará que se añada un nuevo recurso con extensión .prefab.

A continuación, se arrastrará el GameObject «Proyectil» construido en el paso anterior, dentro del prefab creado, consiguiendo así que los componentes del GameObject se añadan al prefab añadido a los recursos del proyecto (ya se podrá eliminar el GameObject «Proyectil» de la escena, quedándonos sólo con el prefab denominado con el mismo nombre).

Para una mejor comprensión de este proceso os incluimos este vídeo:

Posteriormente, y siendo parte de la lógica del ejemplo mostrar como lanzar proyectiles desde el personaje del jugador, se añadirá un nuevo GameObject vacío a la escena, que será hijo del GameObject desde el que se lancen dichos proyectiles (es decir, el personaje que maneje el usuario), que define un componente Transform, y un script. Vemos este script, que llamaremos «InstanciarProyectil»:

En el script:

  • Se declaran dos variables miembro, una de tipo Rigidbody, y la otra de tipo entero (ambas de ámbito público), que serán inicializadas desde el editor de Unity:
    public Rigidbody proyectil; public int velocidad; 
  • A continuación, se define el método Update, void Update () {.....} que será llamado una vez por cada frame.
    En este método se establece la condición de si el usuario pulsa el botón izquierdo del ratón, if(Input.GetButtonDown("Fire1")) {....}, se creará una instancia de un GameObject que defina un componente Rigidbody (en este caso el prefab denominado Proyectil se asigna desde el editor de Unity):
    Rigidbody instanciarProyectil = Instantiate(proyectil, transform.position, transform.rotation) as Rigidbody;Por último se establecen las propiedades de velocidad (dirección en la que será lanzado el proyectil):
    instanciarProyectil.velocity = transform.TransformDirection(new Vector3(0, 0, velocidad));

Si se visualiza la ventana inspector del GameObject encargado de instanciar el prefab construido, quedaría de la siguiente forma (la variable Proyectil será inicializada con tan sólo seleccionar el prefab creado y arrastrarlo dentro del campo asociado a la variable):

Inspector GameObject Proyectil

Finalmente la jerarquía de objetos situados en la escena quedaría de la siguiente forma:

Jerarquía escena

Os incluimos un breve vídeo con el resultado final en el modo juego:

Nota: en el ejemplo descrito en este apartado, se obvian las partes relacionadas con la creación de un GameObject en tercera persona, un terreno o la iluminación de la escena, que son tratados en otras secciones del curso de Unity.

Volver arriba
Esta web usa cookies para su correcto funcionamiento. No hay cookies de publicidad, aunque algunos de los contenidos mostrados (videos o documentos insertados) están alojados en servicios externos (Youtube, Vimeo, Box...) que sí pueden implementar sus propias cookies. También se ha incluido en pruebas un Agente AI que incluye sus propias cookies   
Privacidad