Menu
CoddyTech

Prefabs e instanciar

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 48 de 67.

Un prefab es un GameObject guardado como plantilla: arrastra un objeto de la ventana Hierarchy a 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 Space. 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, con el nombre Parcel(Clone). El prefab permanece tal como estaba, así que cada copia parte de los mismos valores. Aquí es importante usar GetKeyDown: con GetKey, mantener pulsada la tecla Space durante medio segundo dejaría caer unos 30 paquetes, uno por fotograma.

challenge icon

Desafío

Intermedio

Las flechas ya mueven al jugador. Haz que cada clic genere una moneda encima:

  • Añade un campo público de tipo GameObject llamado coinPrefab. La escena lo asigna al prefab Coin en cuanto exista el campo.
  • Cuando se haga clic con el botón izquierdo del ratón, genera una copia de la moneda 2 unidades por encima del jugador, sin rotación.

Pulsa Play, muévete y haz clic unas cuantas veces; después, pulsa Check.

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 le 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);
        }

        // Clic: crea una moneda 2 unidades por encima del jugador
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos de scripting en Unity