Object.Instantiate
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
Submission failed
For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
Declaration
Declaration
Declaration
Declaration
Declaration
Parameters
| original | An existing object that you want to make a copy of. |
| position | Position for the new object. |
| rotation | Orientation of the new object. |
| parent | Parent that will be assigned to the new object. |
| instantiateInWorldSpace | When you assign a parent Object, pass true to position the new object directly in world space. Pass false to set the Object’s position relative to its new parent. |
Returns
Object The instantiated clone.
Description
Clones the object original and returns the clone.
This function makes a copy of an object in a similar way to the Duplicate command in the editor. If you are cloning a GameObject you can specify its position and rotation (these default to the original GameObject’s position and rotation otherwise). If you are cloning a Component the GameObject it is attached to is also cloned, again with an optional position and rotation.
When you clone a GameObject or Component, all child objects and components are also cloned with their properties set like those of the original object.
Note: When this method clones a child object, it also clones the child’s own children. To prevent stack overflow, Unity limits this nested cloning. If you exceed more than half your stack size, Unity throws an InsufficientExecutionStackException .
By default the parent of the new object is null; it is not a «sibling» of the original. However, you can still set the parent using the overloaded methods. If a parent is specified and no position and rotation are specified, the original object’s position and rotation are used for the cloned object’s local position and rotation, or its world position and rotation if the instantiateInWorldSpace parameter is true. If the position and rotation are specified, they are used as the object’s position and rotation in world space.
The active status of a GameObject at the time of cloning is maintained, so if the original is inactive the clone is created in an inactive state too. Additionally for the object and all child objects in the hierarchy, each of their Monobehaviours and Components will have their Awake and OnEnable methods called only if they are active in the hierarchy at the time of this method call.
These methods do not create a prefab connection to the new instantiated object. Creating objects with a prefab connection can be achieved using PrefabUtility.InstantiatePrefab.
Instantiate can be used to create new objects at runtime. Examples include objects used for projectiles, or particle systems for explosion effects.
Instantiate can also clone script instances directly. The entire game object hierarchy will be cloned and the cloned script instance will be returned.
After cloning an object you can also use GetComponent to set properties on a specific component attached to the cloned object.
Instantiate
Instantiate creates/spawns/instantiates a copy/clone of an object.
Examples
Instantiate a prefab when the game starts
The following code will create/spawn/instantiate an instance of a prefab you have referenced.
Instantiate with a reference to the instance
Sometimes you want to operate on an object immediately after you have instantiated it.
Same as above, but stores the instance in a local variable instead of a member variable.
Instantiate with a reference to a Component on the instance
Instantiate was updated by Unity to understand what type the object is you are trying to instantiate.
In Visual Studio, you can hover over Instantiate with the mouse cursor and a tooltip will show you the Type it’s trying to return.
Before this feature, a hard or soft Cast was required. See the following example:
Unity3d. Уроки от Unity 3D Student (B04-B08)
Теперь в каждом посте в скобках (в конце) будут указываться номера уроков. Буква в начале номера обозначает раздел (B-Beginner, I — Intermediate).
PS: Если вы не проходили предыдущие уроки, очень рекомендую их пройти, т.к. последующие изредка на них ссылаются.
Базовый Урок 04 — Уничтожение объектов
В уроке рассказывается как удалять объекты со сцены, использую команду Destroy (уничтожить).
Создайте пустую сцену и добавьте в нее сферу (GameObject->Create Other->Sphere) и куб (GameObject->Create Other->Cube). Куб назовем “Box”. Расположите объекты как показано на рисунке ниже.
Добавьте C#-Скрипт (Project View->Create->C# Script) и назовите его Destroyer. Как уже говорилось, при создании C#-скрипта Unity создает некий каркас, состоящий из подключенных библиотек и основного класса (используемого скриптом) с методами Start() и Update(). В Базовом Уроке 02 (основы ввода) использовался метод Update(), который вызывается каждый кадр. В данном случае мы воспользуемся методом Start(), который выполняется сразу после загрузки сцены. Добавим в тело метода Start() функцию Destroy() и передадим в нее gameObject, указав таким образом, что скрипт должен уничтожить объект, компонентом которого он является:
Добавим скрипт к сфере. Сделать это можно несколькими путями. Перетащив скрипт из Project View на сферу в Scene View. 
Или на имя объекта в Hierarchy. 

Так же можно выбрать сферу и добавить скрипт через меню компонентов (Component->Scripts->Destroyer) или просто перетащив скрипт в Inspector View выбранного объекта.
Снова выберите сферу и убедитесь, что среди компонентов присутствует ваш скрипт. 
Нажмите на Play и вы увидите, что сразу после загрузки сцены сфера исчезает. 
Давайте теперь попробуем уничтожить другой объект. Для этого нам понадобится статический метод Find класса GameObject. Заменим код в методе Start() следующим:
Примечание от автора перевода: Обратите внимание, что во втором случае мы передаем значение, вызывая статическую функцию, поэтому пишем имя класса (GameObject — с большой буквы), в то время как в первом мы передаем объект этого класса (gameObject — с маленькой буквы). В противном случае компилятор выдаст ошибку:
error CS0176: Static member `UnityEngine.GameObject.Find(string)’ cannot be accessed with an instance reference, qualify it with a type name instead
что переводится как:
“статический член UnityEngine.GameObject.Find(string) не может быть доступен по ссылки экземпляра (класса), вместо этого определите (вызовите) его с именем типа.”
Сохраним изменения в коде скрипта. Скрипт не требуется убирать со сферы и добавлять к нашему кубу, т.к. назависимо от того, к какому объекту он теперь прикреплен, скрипт будет искать любой объект (на сцене) с именем Box. Нажмем Play и увидим как теперь сфера остается в сцене, а куб пропадает. 
Что делать, если нам требуется уничтожить объект не сразу, а спустя какое-то время? Это можно сделать передав значение во 2ой параметр функции Destroy:
Нажмите Play и убедитесь, что куб изчезает через 3и секунды после того, как сцена целиком загрузится.
Дополнительные материалы:
Базовый Урок 05 — Реализация создание объектов
В уроке рассказывается как создавать объекты в сцене в реальном времени (runtime), используя префабы и команду Instantiate (инстанциирование)
Если вы хотите добавлять объекты на сцену, когда сцена уже загружена, то вам требуется использовать скрипты, а точнее команду Instantiate().
Загрузите сцену из Базового урока 03 (Префабы) или создайте такую же новую. В нашей сцене присутствует префаб BouncyBox. 
Нажмите Play и убедитесь, что куб по-прежнему падает и отталкивается от поверхностей.
Теперь удалите со сцены экземпляр BouncyBox. 
После этого добавьте пустой объект (напоминаю, GameObject->Create Empty или Ctrl + Shift + N в Windows, Cmd + Shift + N в MacOS). Расположите его примерно в том месте, где раньше был экземпляр BouncyBox. 
Создадим C#-Скрипт и назовем его Creater. Начнем редактирование скрипта. Заведем открытую (public) переменную типа GameObject и назовем ее thePrefab. Модификатор public требуется указывать, если, например, вы хотите передавать значение переменной через Inspector View. После чего в теле функции Start() создадим еще один GameObject (с именем instance) и проинициализируем его значением с помощью статической функции Instantiate().
Рассмотрим метод Instantiate() подробнее.
Метод клонирует объект original с заданными вектором положения (position) и кватернионом поворота (rotation).
Тип Vector3 является обычным 3х компонентым вектором (аналогично вектору из R 3 ).
Тип Quaternion — кватернион, задающий поворот объекта.
Добавьте скрипт к пустому объекту (c именем GameObject).Напоминаю, поскольку thePrefab объявлен с модификатором public, вы можете задавать его начальное значение прямо в Inspector View (у соответствующего компонента, то есть в нашем случае это Creator у GameObject’а). Перетащите наш префаб в место указания значения (или выберете его из списка, кликнув на кружок справа). 
Нажмем Play и увидим, что на сцене появился наш прыгающий кубик. 
Но наш кубик прыгает просто вверх и вниз, потому что не имеет начального угла поворота. Выберите GameObject и поверните его под небольшим углом.
Теперь, нажав Play, вы увидите, что кубик падает и отталкивается под различными углами. 
Дополнительные материалы:
Базовый Урок 06 — Простой таймер
В данном уроке рассказывается как в Unit при помощи скриптов
создавать простой таймер, используя Time.deltaTime и переменную типа float.
Воспользуемся сценой из предыдущего урока (с пустым игровым объектом,
генерирующим экземпляры префаба, т.е. BouncyBox). 
Создадим С#-скрипт и назовем его Timer. Добавим переменную myTimer, и напишем следующий код.
Сохраняем скрипт и переключаемся назад в Unity. Добавим скрипт к объекту GameObject. 
Напомню, т.к. myTimer объявлена открытой (public), то в Inspector View вы можете менять ее начальное значение.
Жмем Play. Как только значение myTimer упадет до нуля, в статус баре вы увидите строку GAME OVER. Значение переменной myTimer будет продолжать опускаться (это можно увидеть в Inspector View). 
Для того, чтобы переменная myTimer не опускалась ниже нуля, добавим еще одно ветвление в функцию Update(), в итоге мы получаем следующий код:
Нажмем Play и проследим за поведением переменной myTimer. Когда ее значение будет достаточно близким к нулю, то оно перестанет изменяться. 
Дополнительные материалы:
Базовый Урок 07 — Основы движения
В уроке рассказывается, как двигать объекты c помощью функции transform.Translate.
Создадим сцену с кубом, камерой и источником света. 
Создадим новый C#-скрипт и назовем его Move.
Поскольку движение должно быть непрерывно во времени, то основной код будет располагаться в методе Update(). Вызовем функцию Translate, объекта transform и передадим ей в качестве параметра Vector3(0, 0, 1). Получим следующий код:
Разберемся подробнее в коде. Тут transform — это объект класса Transform, привязанный к нашему объекту. Метод Translate() двигает объект вдоль вектора на расстояние равное его длине (параллельный перенос).
Сохраним наш скрипт и добавим его к нашему кубу. Нажмите Play и увидите как куб стремительно улетает вдоль оси Oz.

Давайте уменьшим скорость движения, например, умножив наш вектор на Time.deltaTime, то есть:
Нажмите Play и убедитесь, что куб начинает двигаться заметно медленнее.
Можно сделать наш скрипт более удобным в использовании, если скорость задать не фиксированным вектором, а через переменную. Заведем public переменную типа float и назовем ее speed. С помощью этой переменной можно будет задавать начальную скорость через Inspector View (по умолчанию она будет равна 5.0f):
Сохраним скрипт и убедимся, что в Inspector View у компонента Move появилась переменная Speed. 
Посмотрите, как будет меняться скорость движения нашего объекта в соответствии с заданным начальным значением этой переменной. Например, при Speed = 3 скорость объекта не очень быстрая, но и не медленная.
Примечение: Для выражения Vector3(0.0f, 0.0f, 1.0f) существует короткая (но видимо чуть более медленная, если не прав, прошу поправить) запись Vector3.forward.
Кусок кода из обертки:
Дополнительные материалы:
Базовый Урок 08 — Основы движения с помощью силы.
В уроке рассказывается как c помощью приложения силы двигать физическое тело (Rigidbody).
Если у вас на сцене есть объект с компонентом Rigidbody, то нужно задавать ему движение с помощью приложения силы (передав таким образом все расчеты движения физическому движку игры). В противном случае вы можете начать конфликтовать с физикой объекта. Мы по-прежнему используем сцену из Базового урока 03.

Создадим C#-скрипт и назовем его Force. В методе Start() вызовем метод AddForce() компонента rigidbody (cвязанного с нашим объектом) и передадим ему вектор приложенной силы Vector3(0.0f, 0.0f, power). В классе заведем переменную типа float с именем power и значением, по умолчанию равным 500.0f:
Сохраним скрипт и добавим его к нашему объекту (или префабу). Теперь, если нажать Play, вы увидите как куб падает не вниз а под углом, из-за воздействия силы приложенной вдоль оси Oz. 
Object.Instantiate
Эта функция создает копию объекта аналогично команде «Дублировать» в редакторе. Если вы клонируете GameObject, вы можете указать его положение и поворот (в противном случае по умолчанию используются положение и поворот исходного игрового объекта). Если вы клонируете Компонент, игровой объект, к которому он прикреплен, также клонируется, опять же с необязательным положением и поворотом.
При клонировании GameObject или Компонента все дочерние объекты и компоненты также клонируются с набором свойств, как у исходный объект.
По умолчанию родительский элемент нового объекта имеет значение null; это не «родной брат» оригинала. Однако вы все равно можете установить родителя, используя перегруженные методы. Если указан родитель, а положение и поворот не указаны, положение и поворот исходного объекта используются для локального положения и поворота клонированного объекта или его положения и поворота в мире, если instantiateInWorldSpace параметр верный. Если положение и поворот указаны, они используются как положение и поворот объекта в мировом пространстве.
Активный статус игрового объекта во время клонирования сохраняется, поэтому, если оригинал неактивен, клон также создается в неактивном состоянии. Кроме того, для объекта и всех дочерних объектов в иерархии у каждого из их Monobehaviours и Component будут вызываться методы Awake и OnEnable, только если они активны в иерархии во время вызова этого метода.
Эти методы не создают готовое соединение с новым экземпляром объекта. Создание объектов со сборным подключением может быть достигнуто с помощью PrefabUtility.InstantiatePrefab.
// Instantiates 10 copies of Prefab each 2 units apart from each other using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour < public Transform prefab; void Start() < for (int i = 0; i
Экземпляр можно использовать для создания новых объектов во время выполнения. Примеры включают объекты, используемые для снарядов, или системы частиц для эффектов взрыва.
Instantiate также может напрямую клонировать экземпляры скрипта. Будет клонирована вся иерархия игровых объектов, и будет возвращен клонированный экземпляр скрипта.
После клонирования объекта вы также можете использовать GetComponent для установки свойств определенного компонента, присоединенного к клонированному объекту.
Объявление
public static T Instantiate (T original );
public static T Instantiate (T original , Transform parent );
public static T Instantiate (T original , Transform parent , bool worldPositionStays );
public static T Instantiate (T original , Vector3 position , Quaternion rotation );
public static T Instantiate (T original , Vector3 position , Quaternion rotation , Transform parent );
Параметры
| original | Объект типа T, который вы хотите клонировать. |
Возвращает
T Объект типа Т.
Описание
Вы также можете использовать Generics для создания экземпляров объектов. Дополнительные сведения см. на странице Универсальные функции. подробности.
При использовании Generics нам не нужно приводить результат к определенному типу.