Menu
CoddyTech

Prefabs e Instantiate

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 62 de 85.

Un prefab es un GameObject guardado como plantilla: arrastra un objeto desde la ventana Hierarchy hasta la ventana Project y Unity lo guarda con todos sus componentes y valores del Inspector. El prefab en sí no está en la escena. Un script obtiene uno mediante un campo, como cualquier otra referencia: declara public GameObject parcelPrefab; y arrastra el prefab a ese campo en el Inspector.

Instantiate(prefab, position, rotation) crea una copia del prefab en la escena y la devuelve. Este dron de reparto deja caer un paquete en su propia posición cada vez que se pulsa la barra espaciadora. Quaternion.identity significa que no hay rotación:

public GameObject parcelPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Instantiate(parcelPrefab, transform.position, Quaternion.identity);
    }
}

Cada pulsación añade un objeto más a la ventana Hierarchy, llamado Parcel(Clone). El prefab permanece tal como estaba, así que cada copia parte de los mismos valores. GetKeyDown es importante aquí: con GetKey, mantener pulsada la barra espaciadora durante medio segundo dejaría caer unos 30 paquetes, uno por fotograma.

challenge icon

Desafío

Intermedio

Haz que cada clic genere una moneda encima del jugador.

  1. Añade el campo public GameObject coinPrefab;. La escena lo rellena con el prefab Coin.
  2. En Update(), cuando se active Input.GetMouseButtonDown(0), llama a Instantiate(coinPrefab, transform.position + new Vector3(0, 2, 0), Quaternion.identity);.

Pulsa «Jugar», muévete y haz clic: cada vez aparecerá una moneda encima del jugador. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class CoinDropper : MonoBehaviour
{
    public float speed = 4f;
    // coinPrefab: un campo público de tipo GameObject, al que se asigna el prefab Coin

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
        }

        // Click: genera una moneda 2 unidades por encima del jugador
    }
}

Todas las lecciones de Fundamentos de scripting en Unity

Practica por tu cuenta: Playground de Unity