Как копировать объект в юнити
Unity hotkeys
This page gives an overview of the default Unity keyboard shortcuts. You can also download a PDF of the table for Windows and MacOSX. Where a command has Ctrl/Cmd as part of the keystroke, this indicates that the Control key should be used on Windows and the Command key on MacOSX.
The Mac trackpad also has a number of shortcuts for navigating the Scene view. See Scene view navigation to learn more about these.
Tools | |
“Горячая” клавиша | Command |
Q | Pan |
W | Move |
E | Rotate |
R | Scale |
T | Rect Tool |
Z | Pivot Mode toggle |
X | Pivot Rotation Toggle |
V | Vertex Snap |
CTRL/CMD+ЛКМ | Snap |
GameObject | |
Ctrl/Cmd+Shift+N | New empty game object |
Alt+Shift+N | New empty child to selected game object |
Ctrl/Cmd+Alt+F | Move to view |
Ctrl/Cmd+Shift+F | Align with view |
Shift+F or double-F | Locks the scene view camera to the selected GameObject |
Window | |
Ctrl/Cmd+1 | Scene |
Ctrl/Cmd+2 | Game |
Ctrl/Cmd+3 | Inspector |
Ctrl/Cmd+4 | Hierarchy |
Ctrl/Cmd+5 | Project |
Ctrl/Cmd+6 | Animation |
Ctrl/Cmd+7 | Profiler |
Ctrl/Cmd+9 | Asset store |
Ctrl/Cmd+0 | Version Control |
Ctrl/Cmd+Shift+C | Console |
Edit | |
Ctrl/Cmd+Z | Undo |
Ctrl+Y (Windows only) | Redo |
Cmd+Shift+Z (Mac only) | Redo |
Ctrl/Cmd+X | Cut |
Ctrl/Cmd+C | Copy |
Ctrl/Cmd+V | Paste |
Ctrl/Cmd+D | Duplicate |
Shift+Del | Delete |
F | Frame (centre) selection |
Ctrl/Cmd+F | Find |
Ctrl/Cmd+A | Select All |
Ctrl/Cmd+P | Play |
Ctrl/Cmd+Shift+P | Pause |
Ctrl/Cmd+Alt+P | Step |
Selection | |
Ctrl/Cmd+Shift+1 | Load Selection 1 |
Ctrl/Cmd+Shift+2 | Load Selection 2 |
Ctrl/Cmd+Shift+3 | Load Selection 3 |
Ctrl/Cmd+Shift+4 | Load Selection 4 |
Ctrl/Cmd+Shift+5 | Load Selection 5 |
Ctrl/Cmd+Shift+6 | Load Selection 6 |
Ctrl/Cmd+Shift+7 | Load Selection 7 |
Ctrl/Cmd+Shift+8 | Load Selection 8 |
Ctrl/Cmd+Shift+9 | Load Selection 9 |
Ctrl/Cmd+Alt+1 | Save Selection 1 |
Ctrl/Cmd+Alt+2 | Save Selection 2 |
Ctrl/Cmd+Alt+3 | Save Selection 3 |
Ctrl/Cmd+Alt+4 | Save Selection 4 |
Ctrl/Cmd+Alt+5 | Save Selection 5 |
Ctrl/Cmd+Alt+6 | Save Selection 6 |
Ctrl/Cmd+Alt+7 | Save Selection 7 |
Ctrl/Cmd+Alt+8 | Save Selection 8 |
Ctrl/Cmd+Alt+9 | Save Selection 9 |
Assets | |
Ctrl/Cmd+R | Refresh |
Note: The following Animation hotkeys only work in the Animation window.
Управление игровыми объектами (GameObjects) с помощью компонентов
В редакторе Unity вы изменяете свойства Компонента используя окно Inspector. Так, например, изменения позиции компонента Transform приведет к изменению позиции игрового объекта. Аналогично, вы можете изменить цвет материала компонента Renderer или массу твёрдого тела (RigidBody) с соответствующим влиянием на отображение или поведение игрового объекта. По большей части скрипты также изменяют свойства компонентов для управления игровыми объектами. Разница, однако, в том, что скрипт может изменять значение свойства постепенно со временем или по получению ввода от пользователя. За счет изменения, создания и уничтожения объектов в заданное время может быть реализован любой игровой процесс.
Обращение к компонентам
Наиболее простым и распространенным является случай, когда скрипту необходимо обратиться к другим компонентам, присоединенных к тому же GameObject. Как упоминалось во разделе Введение, компонент на самом деле является экземпляром класса, так что первым шагом будет получение ссылки на экземпляр компонента, с которым вы хотите работать. Это делается с помощью функции GetComponent. Типично, объект компонента сохраняют в переменную, это делается в C# посредством следующего синтаксиса:
В UnityScript синтаксис немного отличается:
Как только у вас есть ссылка на экземпляр компонента, вы можете устанавливать значения его свойств, тех же, которые вы можете изменить в окне Inspector:
Имейте ввиду, что нет причины, по которой вы не можете иметь больше одного пользовательского скрипта, присоединенного к одному и тому же объекту. Если вам нужно обратиться к одному скрипту из другого, вы можете использовать, как обычно, GetComponent, используя при этом имя класса скрипта (или имя файла), чтобы указать какой тип Компонента вам нужен.
Если вы попытаетесь извлечь Компонент, который не был добавлен к Игровому Объекту, тогда GetComponent вернет null; возникнет ошибка пустой ссылки при выполнении (null reference error at runtime), если вы попытаетесь изменить какие-либо значения у пустого объекта.
Обращение к другим объектам
Пусть иногда они и существуют изолированно, все же, обычно, скрипты отслеживают другие объекты. Например, преследующий враг должен знать позицию игрока. Unity предоставляет несколько путей получения других объектов, каждый подходит для конкретной ситуации.
Связывание объектов через переменные
Переменная будет видна в окне Inspector, как и любые другие:
Теперь вы можете перетащить объект со сцены или из панели Hierarchy в эту переменную, чтобы назначить его. Функция GetComponent и доступ к переменным компонента доступны как для этого объекта, так и для других, то есть вы можете использовать следующий код:
Кроме того, если объявить переменную с доступом public и заданным типом компонента в вашем скрипте, вы сможете перетащить любой объект, который содержит присоединенный компонент такого типа. Это позволит обращаться к компоненту напрямую, а не через игровой объект.
Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе Unity, а не во время выполнения. Часто удобно находить объекты во время выполнения, и Unity предоставляет два основных способа сделать это, описанных ниже.
Нахождение дочерних объектов
Иногда игровая сцена может использовать несколько объектов одного типа, таких как враги, путевые точки и препятствия. Может возникнуть необходимость отслеживания их в определенном скрипте, который управляет или реагирует на них (например, все путевые точки могут потребоваться для скрипта поиска пути). Можно использовать переменные для связывания этих объектов, но это сделает процесс проектирования утомительным, если каждую новую путевую точку нужно будет перетащить в переменную в скрипте. Аналогично, при удалении путевой точки придется удалять ссылку на отсутствующий объект. В случаях, наподобие этого, чаще всего удобно управлять набором объектов, сделав их дочерними одного родительского объекта. Дочерние объекты могут быть получены, используя компонент Transform родителя (так как все игровые объекты неявно содержат Transform):
Вы можете также найти заданный дочерний объект по имени, используя функцию Transform.Find:
Object.Instantiate
Успех!
Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.
Ошибка внесения изменений
По определённым причинам предложенный вами перевод не может быть принят. Пожалуйста попробуйте снова через пару минут. И выражаем вам свою благодарность за то, что вы уделяете время, чтобы улучшить документацию по Unity.
Параметры
original | An existing object that you want to make a copy of. |
position | Position for the new object (default Vector3.zero). |
rotation | Orientation of the new object (default Quaternion.identity). |
Возврат значений
Object A clone of the original object.
Описание
This function makes a clone of an object in a similar way to the Duplicate command in the editor. If you are cloning a GameObject, or something attached to a GameObject, then you can also optionally specify its position and rotation.
If you are cloning a Component, then the GameObject it is attached to will also be cloned.
When you clone a GameObject or Component, all child objects and components will also be cloned, along with their properties. However, the parent property of the cloned object will be null, so it will not be part of the object hierarchy of the original.
The active status of a GameObject at the time of cloning will be passed, so if the original is inactive then the clone will be created in an inactive state too.
For an in-depth tutorial of Instantiate and its uses, visit: In depth Prefab Instantiate discussion.
In this example, we instantiate 10 copies of a prefab object in a line along the x axis.
Instantiate can also clone script instances directly. The 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.
Unity3D копировать параметры компонентов [РЕШЕНО]
Всем, доброго времени суток. Надеюсь, на форуме есть любители Unity3D.
есть GameObject go с компонентом ObjStates(скрипт), в котором хранятся некие данные.
Вопрос: как можно вытянуть эти данные и присвоить другому объекту с таким же компонентом и при этом первый объект удалить?
Заранее, благодарю. Очень буду рад любым попыткам мне помочь.)
Сначала получаешь ссылку на экземпляр класса хранящегося в объекте 1
Все понятно, кроме «GetDataFromOldClass». Это что-за функция такая?
Я пробовал по такому принципу:
controller = OBJ1.GetComponentinChildren ();
OBJ2.GetComponentinChildren () = controller;
или
OBJ1.GetComponentinChildren () =
OBJ2.GetComponentinChildren ();
Но при удалении первого объекта данныe во втором тоже удаляются(.
Ты присваиваешь ссылку, поэтому и удалется.
Ты должен создать новый компонент в новом объекте.
Взять старый компонент из старого объекта.
Присвоить поля от одного к другому, имено поля а не объекты, через рефлекшен или серелизатор юньки.
Потом удалить старый компонент из объекта.
Все заработало! Большое спасибо за помощь!!
Рабочий вариант:
Component new_comp;
GameObject g = (Instantiate(Resources.Load(path)) as GameObject); //Загрузил префаб
Component old_comp = g.GetComponent (); //взял ссылку
new_comp = gameObject.AddComponent ();// вот без этого не работало
// и вручную перетащил параметры
new_comp.texture = old_component.texture;
GameObject.Destroy(g);
Создание экземпляров префабов во время работы приложения
Префабы приходятся очень кстати, когда вы хотите создать экземпляры сложных игровых объектов во время игрового процесса. Альтернативой создания экземпляров префабов является создание GameObject с нуля используя код. Создание экземпляра префаба имеет много преимуществ над альтернативным подходом:
Общие сценарии
Чтобы показать мощь префабов, давайте рассмотрим некоторые основные ситуации, где они могут пригодиться:
Построение стены
Это объяснение иллюстрирует преимущества использования префабов над созданием объектов из кода.
В первую очередь, давайте построим стену из кода:
Если вы создадите префаб и выполните все установки вручную, то вам понадобится использовать лишь по одной строке на создание и установку каждого кирпича. Это освобождает вас от поддержания и изменения тонн кода, когда вы хотите внести изменения. При использовании префаба вы просто вносите изменения в него и жмёте Play. Совсем нет надобности изменять код.
Если вы используете префаб для каждого кирпича, то вот код, который вам понадобится для создания стены.
Он не только очень чистый, но им можно пользоваться много раз. В нём не упоминается ни создание куба, ни то, что он должен содержать Rigidbody. Всё это задано в префабе, который может быть быстро создан в редакторе
Теперь нам остаётся лишь создать префаб, который мы делаем в редакторе. Вот так:
Мы создали наш префаб кирпича, так что теперь надо присоединить переменную brick к нашему скрипту. Когда вы выбираете пустой GameObject, что содержит скрипт, переменная brick будет видна в инспекторе.
Теперь перетащите префаб “Brick” из окна Project View на переменную brick в инспекторе. Нажмите Play и вы увидите стену построенную из префабов.
Этот шаблон рабочего процесса можно использовать и использовать в Unity. В начале вы, возможно, будете интересоваться, почему же это лучше, чем создание куба из кода, который длиннее лишь на две строки.
Но т.к. вы сейчас используете префаб, вы можете настроить Prefab за секунды. Хотите внести изменения для всей кучи образцов? Настройте Rigidbody в префабе всего один раз. Хотите использовать иной Material для всех образцов? Перетащите материал на префаб всего один раз. Хотите изменить трение? Используйте другой физический материал ( Physic Material ) в коллайдере префаба. Хотите добавить системы частиц ко всем кирпичам? Добавьте дочернюю систему к префабу всего один раз.
Создание экземпляров ракет и взрывов
Вот как префабы подходят для данного сценария:
В то время как можно собрать объект ракеты полностью из кода, вручную добавляя компоненты и устанавливая свойства, было бы гораздо проще просто создать экземпляр префаба. Вы можете создать экземпляр ракеты просто одной строкой кода, не важно, насколько сложным будет префаб ракеты. После создания экземпляра префаба, вы также можете изменить любые свойства созданного экземпляра объекта (например, вы можете установить скорость Rigidbody ракеты).
Замена персонажа на Ragdoll или обломки
Допустим у вас есть вражеский персонаж с ригом и он умирает. Вы можете просто проиграть анимацию смерти и отключить все скрипты, которые обычно отвечают за логику врага. Вам, скорее всего, придётся позаботиться об удалении нескольких скриптов, добавлении некоторой дополнительной логики, чтобы убедиться, что никто не будет атаковать уже мёртвого врага, и о других задачах очистки.
Гораздо лучше будет подход, включающий мгновенное удаление всего персонажа, и замена его созданным экземпляром префаба обломков. Это даёт вам больше возможностей. Вы можете использовать другой материал для мёртвого персонажа, присоединить совершенно другие скрипты, создать экземпляр префаба содержащий объект сломанный на много кусков, чтобы симулировать разбившегося врага, или просто создать экземпляр префаба, содержащий определённую версию персонажа.
Это стандартные шаги, если надо собрать префаб сломанного самолёта:
Следующий пример покажет, как эти шаги моделируются в коде.
Размещение группы объектов по заданному шаблону
Допустим вы хотите поместить группу объектов по сетке или кругу. Как всегда, это может быть выполнено двумя способами:
Так используйте вместо этого Instantiate() с префабом! Мы думаем, что вы уже поняли нашу идею, почему префабы так удобны в этих случаях. Вот необходимый для этих сценариев код: