Unity Prefabs

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introducción

  • Un Prefab es un concepto clave y un recurso fundamental en el desarrollo de juegos en Unity.


  • Podemos definir un Prefab como un Asset al que hemos añadido un transform y cualquier otro componente.
Fijarse que digo Asset y no GameObject.
Recordar que cuando vimos la diferencia entre Asset y GameObject indicamos que este último tiene un transform asocioado, y un Asset no.
  • Sin embargo, un Prefab es un Asset con un trasnform asociado (y otros componentes) pero a diferencia del GameObject, no se encuentra en la escena inicialmente, sino que dinámicamente (es decir, durante la ejecución del juego) se van creando nuevos GameObjects basados en el Prefab, el cual tiene un transform y otros componentes asociados.


  • Un prefab nos sirve para 'plantilla' para crear nuevos gameobjects en la escena, con unos componentes ya asociados.
Imaginar que disponemos de un Prefab que muestra una bala. Dicho Prefab tiene asociado un script que hace que la bala vaya hacia adelante a una velocidad.
Cuando pulsamos la tecla de disparo, crearíamos un gameobject basado en este modelo, y al crearlo, se ejecutaría su script asociado y la bala empezaría a desplazarse hacia adelante.
De esta forma no tenemos que tener todas las balas en forma de GameObjects ya creados, en la escena.


  • Enemigos que 'aparecen' cada cierto tiempo es otro ejemplo de uso de los prefabs.


  • Preparación previa:
  • Para realizar los ejercicios de esta sección, crea una nueva escena de nombre Escena_Prefabs.



Crear Prefabs

  • Preparación previa:
  • Crea un 'Empty GameObject' de nombre 'CrearPrefab' situado en la posición (0,0,0) (recuerda que puedes hacer un 'reset' del componente Transform pulsando sobre la rueda dentanda a la derecha del componente)
  • A partir de ahora, crea cualquier GameObject que se indique como 'hijo' de este GameObject vacío.


  • Para crear un Prefab, lo único que tenemos que hacer es arrastrar un GameObject a la ventana Project Window.
Normalmente, para tener todo un poco organizado, se crea una carpeta de nombre Prefabs y dentro de la misma se organiza según el juego, como vimos en este punto de la Wiki.


  • Ya está !!!
Es fácil eh :)
  • Fijarse, como he comentado al principio que ahora disponemos de un 'Asset' especial, ya que este asset está formado por todos los componentes que tenía el gameobject al que hemos asociado.
Ahora con este prefab vamos a poder 'crear' múltiples gameobjects con los mismos componentes.
Arrastrar ahora dos veces el prefab hasta el Empty GameObject de la escena.
Unity3d prefabs 3.jpg
  • Se crean dos nuevos GameObjects con los mismos componentes que los que hay en el Prefab. Moverlos para que no estén en la misma posición...


  • Al estar en 'azul' significa que todos ellos están conectados al prefab.
Esto quiere decir que cualquier modificación sobre el Prefab o sobre los GameObjects que se encuentren en azul será replicada a todos ellos.
  • En el ejemplo, vamos a añadir al Prefab un componente Collider, concretamente un Cápsule Collider.


  • Esta conexión es bidireccional, quiere decir que si modifico el GameObject también puedo modificar el Prefab asociado y al actualizar el prefab también se actualizarían todos los GameObjects asociados.
Vamos a crear una carpeta en la Project Window (si no lo está ya) de nombre /Assets/Scripts/UD3/Prefabs como muestra la imagen:
Unity3d prefabs 6.jpg
Dentro de dicha carpeta vamos a crear un script de nombre 'ProyectilGestion' que inicialmente va a hacer que el GameObject que tenga asociado este script, se mueva hacia adelante a una velocidad indicada en la ventana Inspector.
 1 using UnityEngine;
 2 
 3 public class ProyectilGestion : MonoBehaviour {
 4 
 5     [SerializeField]
 6     public float velocidad;
 7 
 8     private void Reset()
 9     {
10         velocidad = 5f;
11     }
12     // Use this for initialization
13     void Start () {
14 		
15 	}
16 	
17 	// Update is called once per frame
18 	void Update () {
19 
20         transform.Translate(transform.forward * velocidad * Time.deltaTime);
21 
22 
23 	}
24 }


  • Una vez creado, vamos a añadir este script al gameobject de nombre Projectil(1).
  • Sio ejecutamos el juego podemos ver como los tres proyectiles van hacia adelante.



  • Si queremos seleccionar automáticamente el Prefab asociado a un GameObject, pulsaremos el botón 'Select' del GameObject en la ventana Inspector:



  • Si estamos trabajando con un GameObject asociado a un Prefab y 'nos equivocamos al realizar cualquier operación sobre el mismo' podemos 'recuperar' los componentes originales del Prefab asociado pulsando el botón Revert.



Rompiendo la relación entre Prefab-GameObject

  • En cualquier momento podemos hacer que un GameObject deje de tener relación con el Prefab y pase a ser un GameObject como los creados hasta ahora.
Cualquier modificación que se haga sobre el mismo no afectará ni al Prefab ni al resto de GameObjects basados en el Prefab.



Referenciando a otros GameObjects de la escena desde un Prefab


Instanciando Prefabs en ejecución

http://wiki.cifprodolfoucha.es/index.php?title=Unity_Recursos:_Asset_Store#Importando_Standard_Asset_Packages











-- Ángel D. Fernández González -- (2018).