ПрефабыТип ресурса, который позволяет хранить GameObject вместе с компонентами и свойства. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов на сцене. Подробнее
См. в Словарь. создавать сложные GameObjectsосновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Просмотрите в Словарь или коллекции игровых объектов во время выполнения. По сравнению с созданием GameObjects с нуля с помощью кода, создание префабов с помощью кода имеет много преимуществ, поскольку вы можете:
- Создайте префаб, используя одну строку кода. Для создания эквивалентных игровых объектов с нуля требуется гораздо больше строк кода.
- Настройте, протестируйте и измените префаб быстро и легко, используя СценуСцена содержит среды и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Просмотреть в представлении Словарь, Иерархия и ИнспекторОкно Unity, в котором отображается информация о выбранном в данный момент игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать ценности. Подробнее
См. в Словарь. - Измените экземпляр префаба, не меняя код. Вы можете превратить простую ракету в суперзаряженную ракету без каких-либо изменений в коде.
Примечание. Вы можете скачать проект Unity, содержащий все примеры на этой странице, здесь:
InstantiatingPrefabsExamples.zip
Основы создания префаба
Чтобы создать экземпляр префаба во время выполнения, вашему коду нужна ссылка на этот префаб. Вы можете сделать эту ссылку, создав общедоступную переменную в своем коде для хранения ссылки на Prefab. Публичная переменная в вашем коде отображается как назначаемое поле в Инспекторе. Затем вы можете назначить фактический префаб, который хотите использовать в Инспекторе.
Приведенный ниже пример скрипта содержит одну общедоступную переменную myPrefab, которая является ссылкой на префаб. Он создает экземпляр этого префаба в методе Start().
using UnityEngine;
public class InstantiationExample : MonoBehaviour
{
// Reference to the Prefab. Drag a Prefab into this field in the Inspector.
public GameObject myPrefab;
// This script will simply instantiate the Prefab when the game starts.
void Start()
{
// Instantiate at position (0, 0, 0) and zero rotation.
Instantiate(myPrefab, new Vector3(0, 0, 0), Quaternion.identity);
}
}
Чтобы использовать этот пример:
- Создайте новый скрипт C# в своем проекте и назовите его «InstantiationExample».
- Скопируйте и вставьте приведенный выше пример скрипта в новый скрипт и сохраните его.
- Создайте пустой игровой объект, используя меню Игровой объект > Создать пустой.
- Добавьте скрипт в новый игровой объект в качестве компонента, перетащив его на пустой игровой объект.
- Создайте любой Prefab и перетащите его из окна проектаОкно, показывающее содержимое папки
Assets
(вкладка "Проект") Подробнее
См. в Словарь в разделе Мои заготовки в компоненте скрипта.

Когда вы запускаете игровой режим, вы должны увидеть, что ваш префаб создается в позиции (0, 0, 0) в сцене.
Вы можете перетащить другой префаб в поле Мой префаб в Инспекторе, чтобы изменить экземпляр префаба, не изменяя сценарий.
Поскольку этот первый пример очень прост, может показаться, что он не дает никаких преимуществ по сравнению с простым размещением префаба в сцене самостоятельно. Однако возможность создавать префабы с помощью кода дает вам мощные возможности для динамического создания сложных конфигураций игровых объектов во время работы вашей игры или приложения, как показано в следующих примерах.
Распространенные сценарии
Чтобы проиллюстрировать преимущества создания экземпляров префабов во время выполнения, приведем несколько основных ситуаций, в которых они полезны:
- Построение структуры из одного префаба путем его повторения несколько раз в разных положениях, например в виде сетки или круга.
- Выстрел сборным снарядом из пусковой установки. Префаб снаряда может представлять собой сложную конфигурацию, содержащую Meshосновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в Словарь, RigidbodyКомпонент, позволяющий воздействовать на GameObject смоделированной гравитацией и другими силами. Подробнее
См. в Словарь, КоллайдерНевидимая форма, используемая для обработки физических столкновений объекта. Коллайдер не обязательно должен быть точно такой же формы, как сетка объекта — грубое приближение часто бывает более эффективным и неразличимым в игровом процессе. Подробнее
См. в Словарь, AudioSource, Dynamic Light и дочерний GameObject со своим собственным следом Particle SystemПодробнее
См. в Словарь. - Транспортное средство, здание или персонаж, например робот, распадающийся на множество частей. В этом сценарии пример скрипта удаляет и заменяет готовый рабочий префаб робота неисправным префабом робота. Этот разрушенный префаб состоит из отдельных сломанных частей робота, каждая из которых оснащена собственными твердыми телами и системами частиц. Этот метод позволяет разбить робота на множество частей всего одной строкой кода, которая заменяет исходный игровой объект поврежденным префабом.
В следующих разделах показано, как реализовать эти сценарии.
Построение структуры
Вы можете использовать код для почти мгновенного создания множества копий префаба в определенной конфигурации. Использование кода для создания подобных структур называется процедурной генерацией. В приведенном ниже примере создается стена экземпляров блоков.
Чтобы попробовать этот пример, создайте приведенный ниже сценарий, назовите его Стена и поместите его на пустой игровой объект в вашей сцене.
using UnityEngine;
public class Wall : MonoBehaviour
{
public GameObject block;
public int width = 10;
public int height = 4;
void Start()
{
for (int y=0; y < height; ++y)
{
for (int x=0; x < width; ++x)
{
Instantiate(block, new Vector3(x,y,0), Quaternion.identity);
}
}
}
}
После этого вы должны увидеть переменную Block в Инспекторе со словом None в поле. Значение «Нет» означает, что этой переменной еще не присвоен ни один префаб.

Приведенный выше пример скрипта не будет работать, пока вы не назначите Prefab переменной Block. Чтобы создать простой префаб блока:
Выберите Игровой объект > 3D-объект > Куб.
Перетащите куб из окна Иерархия wв окно в папку Активы в Проекте окно. При этом создается сборный объект.
Переименуйте префаб в «Блок».
Теперь, когда ваш префаб Block существует как актив, вы можете безопасно удалить куб из своей иерархии.
Теперь, когда вы создали префаб блока, вы можете назначить его переменной Block. Выберите исходный GameObject (тот, к которому прикреплен скрипт «Стена»). Затем перетащите префаб «Блок» из окна проекта в слот переменной «Блок» (где написано «Нет»).

После завершения этой настройки нажмите Воспроизвести, и вы увидите, что Unity строит стену, используя префаб:

Это гибкий шаблон рабочего процесса, который вы можете использовать в Unity снова и снова. Поскольку в этом скрипте вы используете префаб, вы можете легко заменить или отредактировать префаб, чтобы изменить свойства кирпичей в стене, без необходимости прикасаться к скрипту. Вы также можете использовать свой сценарий стены на других игровых объектах в вашей сцене с назначенными им разными префабами, чтобы иметь разные стены, сделанные из разных типов префабов.
Вы можете использовать код для размещения GameObject в сетке, в виде круга, случайным образом разбросанных или любых других конфигураций, которые вы можете придумать, чтобы соответствовать любой игре или приложению, которое вы создаете. Вот еще один пример, показывающий, как размещать экземпляры по кругу:
using UnityEngine;
public class CircleFormation : MonoBehaviour
{
// Instantiates prefabs in a circle formation
public GameObject prefab;
public int numberOfObjects = 20;
public float radius = 5f;
void Start()
{
for (int i = 0; i < numberOfObjects; i++)
{
float angle = i * Mathf.PI * 2 / numberOfObjects;
float x = Mathf.Cos(angle) * radius;
float z = Mathf.Sin(angle) * radius;
Vector3 pos = transform.position + new Vector3(x, 0, z);
float angleDegrees = -angle*Mathf.Rad2Deg;
Quaternion rot = Quaternion.Euler(0, angleDegrees, 0);
Instantiate(prefab, pos, rot);
}
}
}

Создание снарядов и взрывов
В этом сценарии:
Игровой объект Launcher создает префаб снаряда, когда игрок нажимает кнопку огня. Префаб содержит сетку, твердое тело и коллайдер, поэтому он может летать по воздуху и определять, когда происходит столкновениестолкновение происходит, когда физический движок обнаруживает, что коллайдеры двух GameObject соприкасаются или перекрываются, когда хотя бы один из них имеет компонент Rigidbody и находится в движении. Подробнее
См. в Словарь.Снаряд сталкивается с чем-то и вызывает взрыв Prefab. Префаб взрыва содержит эффект системы частиц и скрипт, который применяет силу к окружающим игровым объектам.
Точно так же, как и в префабе блока выше, вы можете создать экземпляр снаряда всего одной строкой кода, независимо от сложности префаба снаряда. После создания экземпляра Prefab вы также можете изменить любые свойства созданного экземпляра GameObject. Например, вы можете установить скорость Rigidbody снаряда.
Помимо того, что это проще в использовании, вы можете изменить префаб позже, не касаясь кода. Итак, если ваш снаряд — ракета, позже вы можете добавить к нему систему частиц, чтобы он оставлял облачный след. После этого все созданные вами ракеты будут иметь следы частиц.
В этом скрипте показано, как запустить снаряд с помощью функции Instantiate().
using UnityEngine;
public class FireProjectile : MonoBehaviour
{
public Rigidbody projectile;
public float speed = 4;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Rigidbody p = Instantiate(projectile, transform.position, transform.rotation);
p.velocity = transform.forward * speed;
}
}
}
В коде тип переменной Prefab — Rigidbody, а не GameObject. Это имеет два полезных эффекта:
Эта переменная может быть назначена только игровым объектам с компонентом Rigidbody. Это полезно, потому что помогает убедиться, что вы присваиваете переменной правильный GameObject.
Метод Instantiate возвращает ссылку на компонент Rigidbody в новом экземпляре. Это полезно, потому что упрощает установку скорости Rigidbody сразу после его создания.
При создании общедоступной переменной Prefab типом переменной может быть GameObject или любой допустимый тип компонента (либо встроенный компонент Unity, либо один из ваших собственных скриптов MonoBehaviour).
Для переменных типа GameObject вы можете присвоить переменной любой GameObject, а функция Instantiate возвращает ссылку на новый экземпляр GameObject.
Для переменных типа компонента (таких как Rigidbody, Collider и Light) вы можете назначать только игровые объекты этого типа компонента переменной, а функция Instantiate возвращает ссылку на этот конкретный компонент в новом экземпляре GameObject.
Следующий скрипт (помещенный в префаб снаряда) выполняет действие по созданию экземпляра взрыва в текущей позиции снаряда и удалению игрового объекта снаряда, когда снаряд сталкивается с чем-либо.
using UnityEngine;
public class Projectile : MonoBehaviour
{
public GameObject explosion;
void OnCollisionEnter()
{
Instantiate(explosion,transform.position,transform.rotation);
Destroy(gameObject);
}
}

Примечание на изображении выше, где показаны скриптыфрагмент кода, позволяющий создавать собственные компоненты, запускать игровые события, изменяйте свойства компонентов с течением времени и реагируйте на действия пользователя любым удобным для вас способом. Подробнее
Посмотрите, как Словарь работает в режиме Play, созданные игровые объекты появляются в иерархии, со словом «(Клон)», добавленным к имени.
Замена персонажа тряпичной куклой или затонувшим кораблем
Часто в играх вам может понадобиться переключить персонажа, транспортное средство, здание или другой актив из «неповрежденного» состояния в «разрушенное». Вместо того, чтобы пытаться модифицировать неповрежденную версию GameObject (например, удалять скрипты, добавлять компоненты Rigidbody и т. д.), часто гораздо эффективнее удалить весь неповрежденный GameObject и заменить его созданным экземпляром разрушенного Prefab. Это дает вам большую гибкость. Вы можете использовать другой материал для уничтоженной версии, прикрепить совершенно другие скрипты или создать префаб, содержащий игровой объект, разбитый на множество частей, чтобы имитировать разрушенную и разбитую версию исходного игрового объекта. Любая из этих опций может быть достигнута с помощью одного вызова Instantiate(), чтобы перенести вашу уничтоженную версию в сцену, удалив при этом оригинал.
Самое главное, вы можете создать уничтоженную версию, которую вы Instantiate() с совершенно другими GameObjects по сравнению с оригиналом. Например, чтобы создать ломаемого робота, вы должны смоделировать две версии: одна состоит из одного игрового объекта с Mesh Renderer
и скрипты для движения робота, а другой состоит из нескольких частей скелета, которыми можно управлять по отдельности с помощью физики. Ваша игра работает быстрее при использовании модели только с одним GameObject, потому что модель содержит меньше треугольников и, следовательно, рендерится быстрее, чем робот, состоящий из множества мелких деталей. Кроме того, пока ваш робот счастливо разгуливает, нет причин разделять его на части.
Чтобы построить сборную модель разбитого робота, вы можете:
Смоделируйте своего робота, используя множество различных частей скелета, в своем любимом программном обеспечении для 3D-моделирования и экспортируйте его в папку Assets вашего проекта Unity.
Создайте пустую сцену в редакторе Unity.
Перетащите модель из окна проекта в пустую сцену.
Добавьте Rigidbody ко всем деталям, выбрав все детали и выбрав Component > Physics > Rigidbody.
Добавьте коллайдеры ко всем частям, выделив все части и выбрав Компонент > Физика > Коллайдер сетки (включите параметр Выпуклая для повышения производительности).
Убедитесь, что все части разбитого робота связаны с одним корневым игровым объектом.
Для дополнительного специального эффекта добавьте систему частиц, похожую на дым, в качестве дочернего игрового объекта для каждой из частей.
Теперь у вас есть робот с несколькими взрывающимися частями. Части могут падать на землю, потому что они контролируются физикой, и каждая часть создает след частиц из-за прикрепленной системы частиц.
Нажмите "Воспроизвести", чтобы просмотреть реакцию модели и внести необходимые изменения.
Перетащите корневой GameObject в папку Assets в окне проекта, чтобы создать новый префаб.
В следующем примере показано, как можно смоделировать эти шаги в коде.
using UnityEngine;
public class WreckOnCollision : MonoBehaviour
{
public GameObject wreckedVersion;
// Update is called once per frame
void OnCollisionEnter()
{
Destroy(gameObject);
Instantiate(wreckedVersion,transform.position,transform.rotation);
}
}

Вы можете скачать проект, содержащий все эти примеры, здесь: InstantiatingPrefabsExamples.zip