Как копировать объекты в юнити
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.
Создание объектов
Некоторые игры имеют постоянное количество объектов на сцене, однако обычно персонажи, пули, сокровища и другие объекты создаются и удаляются во время игры. В Unity, игровой объект (GameObject) может быть создан через функцию Instantiate, которая делает копию существующего объекта. Объект, который мы будем клонировать, должен быть prefab’ом и сохранен в папке Resources.
Сейчас ты напишешь пару скриптов, с помощью которых можно научиться создавать (spawn’инть) игровые объекты, например, для того, чтобы реализовать механику вот такой ловушки:
Ловушка
Подготовка
Тебе понадобятся четыре игровых объекта и скрипт, с которым ты уже знаком:
Stone
По нашему плану нам понадобятся камни, которые будут создаваться над головой Игрока. Выбери 3D-модель, которая тебе понравилась, добавь ей компоненты Rigidbody и два коллайдера: Capsule и Box. Box коллайдер должен быть чуть больше, чем Capsule, а также иметь включенным свойство Trigger.
После этого добавь этому игровому объекту скрипт OnTriggerSceneLoader и укажи в его свойствах название текущей сцены (а еще не забудь добавить ее в Build Settings).
Stone и его компоненты
Не забудь сохранить объект Stone, как prefab, в папке Resources!
Программирование
Тебе понадобятся два новых скрипта, чтобы все работало как нужно: Spawner.cs и TrapSwitch.cs
Spawner
Как мы уже говорили, в Unity есть функция Instantiate, которая делает копию существующего объекта:
В нашем случаем наш объект будет физическим, так что ты можешь сразу объявить Rigidbody, также понадобится переменная, в которой ты будешь указывать необходимое количество клонов:
Теперь нужно написать публичный метод, который ты будешь вызывать скриптом TrapSwitch.cs, стандартные методы Update() и Start() нам не понадобятся, так что их можно удалить:
Чтобы выполнить функцию Instantiate несколько раз, используй цикл, например, do while:
Технически, скрипт готов, но, если оставить все как есть, то во время выполнения метода Spawn(), практически, одновременно в одной точке появятся все amount (число) клоны. Из-за того, что наши клоны содержат в себе компоненты Rigidbody и коллайдер, клоны просто разлетятся в разные стороны, что выглядит не очень. При этом, шанс, что хотя бы один клон-камень попадет в Игрока будет очень низок. Поэтому добавь немного рандома и сделай так, чтобы каждый следующий камень создавался выше предыдущего на i:
Теперь все работает как нужно. Продолжим.
TrapSwitch
TrapSwitch будет размещен на объекте с триггером, когда Игрок будет его касаться, TrapSwitch будет запускать метод Spawn() у объекта Spawner. Напомним про коллайдеры и триггеры:
Сейчас тебе понадобиться метод OnTriggerEnter. Он выполняется, когда объект только вошел в зону триггера один раз. Создай такой скрипт:
Ты собираешься взаимодействовать с двумя игровыми объектами и объектом Spawner. Их нужно объявить:
Теперь необходимо убедиться, что объект, который войдет в триггер является Игроком. Это можно сделать, используя тег, как в OnTriggerSceneLoader:
Теперь последовательно напиши все необходимые команды внутрь условия: удаление (уничтожение) объекта TrapOn, включение объекта TrapOff, выполнение метода Spawn() и удаление (уничтожения) себя.
Все скрипты написаны. Поздравляем! Осталось правильно разместить все объекты на сцене и не забыть указать им друг на друга.
Управление игровыми объектами (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:
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);
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.