3D-манипуляция с объектами — подготовка сцены
Это руководство служит подготовкой к работе с трехмерной обработкой объектов . В этом руководстве мы будем использовать существующие функции Unity для создания управляемого мышью курсора, способного перемещать объекты в трехмерной сцене. В руководстве по обработке трехмерных объектов мы заменим устройство ввода мыши для жестов и движений рук.
Если вы хотите сосредоточиться только на изучении того, как использовать жесты с Unity, вы можете перейти к руководству по работе с трехмерными объектами .
Выполнение этого руководства займет около 30 минут.
Скачивание окончательного результата
Окончательный проект Unity, полученный в этом руководстве, можно найти в нашем репозитории примеров с открытым кодом на сайте GitHub. После клонирования репозитория выполните следующие действия, чтобы запустить приложение:
- Запустите Unity на вкладке «Проекты » нажмите кнопку «Открыть«.
- Перейдите к каталогу Unity\Tutorials\3D Object Manipulation — Scene Preparation directory в клонированном репозитории.
- Нажмите кнопку воспроизведения (или CTRL+P), чтобы запустить сцену.
Предварительные требования
В этом руководстве предполагается, что у вас есть базовое знакомство с языком программирования C# и опытом работы с средой Unity. Предполагается, что вы знаете, как создавать проекты Unity, сцены, игровые объекты и сценарии.
Перед началом работы с этим руководством рекомендуется выполнить руководство по вводным сведениям.
Шаг 1. Создание объекта игры курсора
- Если вы завершили вводное руководство, откройте проект, созданный в этом руководстве, и нажмите клавиши CTRL+N , чтобы создать новую сцену. В противном случае создайте проект Unity и импортируйте набор средств Project Pra для Unity (см. шаг 1 в вводном руководстве по инструкциям).
- Нажмите клавиши CTRL+S, чтобы сохранить сцену, назвав ее трехмерными объектами.
- Создайте пустой игровой объект и назовите его Cursor. Создайте соответствующий скрипт C# с тем же именем. Чтобы связать игровой объект со сценарием, перейдите в представление инспектора игрового объекта и перетащите скрипт в пустую область под кнопкой «Добавить компонент » (см. шаг 3 в вводном руководстве , чтобы прочитать о связывании скрипта с игровым объектом).
- Откройте скрипт Cursor в Visual Studio (дважды щелкните значок скрипта в окне проекта ) и замените его содержимое следующим кодом:
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Чтобы нарисовать курсор в правильном положении при каждом обновлении экрана, замените содержимое метода OnGUI() в Cursor.cs следующим:
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.


Шаг 2. Выделение объекта под курсором
Мы хотели бы использовать курсор для перемещения объектов в сцене. Чтобы распознать объект, который находится в данный момент под курсором, мы выделим контур этого объекта.

-
Начните с заполнения сцены несколькими примитивными объектами. Для удобства рекомендуется достичь точки зрения главной камеры перед добавлением новых примитивов в сцену: выберите главную камеру в окне иерархии , перейдите в меню GameObject и выберите «Выровнять представление по выбранному«. Чтобы создать экземпляр новых примитивов, снова перейдите в меню GameObject , выберите трехмерный объект и выберите один из примитивов в подменю (Cube, Sphere и т. д.). Повторите этот процесс несколько раз, переместив каждый новый примитив в другое место в сцене:
Совет Чтобы переместить объект, щелкните его, нажмите клавишу W, а затем перетащите его с помощью gizmo Move.
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Также добавьте следующие открытые члены. Мы скоро будем использовать их для реализации функции выделения.
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Чтобы определить, какой объект находится под курсором, замените содержимое метода GetHoveredObject() следующей реализацией:
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Чтобы выделить наведенный объект, замените содержимое Update() следующим:
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Сохраните все изменения в скрипте Cursor.cs .


Шаг 3. Перемещение выделенного объекта
На этом шаге мы разместим курсор на захват объекта и переместим его в пространстве.
-
В скрипте Cursor.cs подготовьте следующие закрытые члены:
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
И следующий открытый член:
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
- Введите (оставьте) режим захвата при нажатии левой кнопки мыши (отпускается) при наведении указателя мыши на объект.
- Когда в режиме захвата объект, наведенный на указатель, должен следовать курсору.
Для этого измените метод Update() следующим образом:
Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.

Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Можно ли в unity заморозить изменение размера объекта?
Есть объект родитель, который меняется в размере, есть дочерний объект, который мне не нужно менять в размере, как лучше запретить ему изменять scale?
- Вопрос задан более трёх лет назад
- 1570 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2

Denis Gaydak @MrMureno Куратор тега Unity
VR for all
если у родителя будет скэил по нулям. то вы там хоть как изголяйтесь..) дочерный вы никак не «подстроите»)
скэил дочерних считается от родителя) а ноль на что не умножай..ноль будет))
подумайте тогда вообще над иерархией объектов.
он точно должен быть у вас дочерним??
может его рядом «положить» и только позицию и/или поворот привязать к другому объекту (скриптом)??
Заморозка движения объектов в unity3d [закрыт]
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 4 года назад .
Нужно при соприкосновении заморозить движение объектов.
С заморозкой движения одного объекта я бы и сам справился , но вот есть ли возможность заморозить движения всех объектов , но не их скрипты + изменение цвета с анимацией также должны работать . Думал над Time.timeScale = 0 , но не уверен будет ли работать ,то что описано выше.
Если же нет легкого способа так сделать , то лучше уж просто заморозить движение объекта. Будет ли работать Time.timeScale = 0 так как нужно , если же нет то что стоит здесь сделать?
Отслеживать
задан 3 июн 2019 в 16:19
Merry_Train Merry_Train
269 6 6 серебряных знаков 25 25 бронзовых знаков
Проверил, Time.timeScale = 0 не работает так как нужно.
3 июн 2019 в 16:29
Попробуйте Time.fixedDeltaTime .
3 июн 2019 в 17:17
У rigidbody есть набор атрибутов для заморозки положения и вращения
3 июн 2019 в 17:31
@Stranger in the Q А если у объекта нету rigidbody , а только collider.
3 июн 2019 в 17:52
@Veudd вы ищете объект на сцене ( GameObject.Find )? если так, то, мне кажется, это неверно и есть гораздо более лучший способ «поиска»
3 июн 2019 в 18:09
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Решение:
1. в скрипте, который висит на объекте, что останавливает все Move-объекты (объекты которые двигаются), объявите событие:
public static event OnCollisionEvent = delegate < >;
(«static» позволит обращаться напрямую к этому событию из любого места)
2. в Move, где-нибудь сделайте метод, который будет содержать логику «остановки» данного объекта
3. в том же Move, где-нибудь в методе Start() вы должны будете подписать ваш Move-объект на глобальное событие остановки. Сделать это можно с помощью следующей строчки:
НазваниеВашегоСкрипта.OnCollisionEvent += НазваниеВашегоМетодаОстановки;
Таким образом, на этот момент, все ваши Move-объекты с момента отработки метода Start будут «слушать» и ждать события OnCollisionEvent
следовательно, вам осталось только вовремя вызвать это событие — а вместе с ним и всех «подписчиков», который следят за событием
4. вызываем событие в том самом скрипте, в методе столкновения (OnCollisionEnter2D) так:
OnCollisionEvent();
Как заморозить вращение по оси z в Unity3d?
Есть куб невидимый куб за которым следит виртуальная камера CineMachine. Этот куб находится в теле персонажа чтобы сделать вид от 3 лица. Написал скриптик поворота этого куба через Rotate и все славно, но при повороте одновременно по Mouse X и Mouse Y то куб поворачивается по оси z и камера наклоняется. Как решить эту проблему?
- Вопрос задан более года назад
- 300 просмотров
5 комментариев
Простой 5 комментариев