Menu
CoddyTech

Префабы и Instantiate

Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 62 из 85.

Префаб — это GameObject, сохранённый как шаблон: перетащи объект из окна Hierarchy в окно Project, и Unity сохранит его вместе со всеми компонентами и значениями в Inspector. Самого префаба в сцене нет. Скрипт получает его через поле, как и любую другую ссылку: объяви public GameObject parcelPrefab; и перетащи префаб в это поле в Inspector.

Instantiate(prefab, position, rotation) создаёт копию префаба в сцене и возвращает её. Этот дрон-доставщик сбрасывает посылку в своей позиции при каждом нажатии Space. Quaternion.identity означает отсутствие поворота:

public GameObject parcelPrefab;

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

Каждое нажатие добавляет ещё один объект в Hierarchy с именем Parcel(Clone). Префаб остаётся без изменений, поэтому каждая копия начинается с тех же значений. Здесь важен GetKeyDown: при использовании GetKey удерживание Space в течение половины секунды привело бы к сбросу примерно 30 посылок — по одной за кадр.

challenge icon

Задание

Средне

Сделай так, чтобы при каждом щелчке над игроком появлялась монета.

  1. Добавь поле public GameObject coinPrefab;. Сцена заполнит его префабом Coin.
  2. В Update() при Input.GetMouseButtonDown(0) вызови Instantiate(coinPrefab, transform.position + new Vector3(0, 2, 0), Quaternion.identity);.

Нажми «Играть», двигайся и щёлкай: каждый раз над игроком будет появляться монета. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class CoinDropper : MonoBehaviour
{
    public float speed = 4f;
    // coinPrefab: публичное поле GameObject, в которое назначен префаб 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: создать монету на 2 единицы выше игрока
    }
}

Все уроки раздела Основы скриптинга в Unity

Потренируйтесь самостоятельно: Песочница Unity