Menu
CoddyTech

Prefabs e Instantiate

Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 62 de 85.

Um prefab é um GameObject salvo como modelo: arraste um objeto da Hierarchy para a janela Project, e o Unity o armazena com todos os seus componentes e valores do Inspector. O prefab em si não está na cena. Um script obtém um por meio de um campo, como qualquer outra referência: declare public GameObject parcelPrefab; e arraste o prefab para esse campo no Inspector.

Instantiate(prefab, position, rotation) cria uma cópia do prefab na cena e a retorna. Este drone de entregas solta um pacote na própria posição sempre que a tecla Space é pressionada. Quaternion.identity significa nenhuma rotação:

public GameObject parcelPrefab;

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

Cada pressionamento adiciona mais um objeto à Hierarchy, chamado Parcel(Clone). O prefab permanece como estava, então cada cópia começa com os mesmos valores. GetKeyDown é importante aqui: com GetKey, manter Space pressionada por meio segundo soltaria cerca de 30 pacotes, um por quadro.

challenge icon

Desafio

Médio

Faça cada clique gerar uma moeda acima do jogador.

  1. Adicione o campo public GameObject coinPrefab;. A cena o preenche com o prefab Coin.
  2. Em Update(), quando ocorrer Input.GetMouseButtonDown(0), chame Instantiate(coinPrefab, transform.position + new Vector3(0, 2, 0), Quaternion.identity);.

Pressione “Jogar”, mova-se e clique: uma moeda aparecerá acima do jogador a cada vez. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

public class CoinDropper : MonoBehaviour
{
    public float speed = 4f;
    // coinPrefab: um campo público do tipo GameObject, preenchido com o 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);
        }

        // Clique: cria uma moeda 2 unidades acima do jogador
    }
}

Todas as lições de Fundamentos de Scripting no Unity

Pratique por conta própria: Playground de Unity