Как сделать перемещение объекта мышью/пальцем?
Вот у меня есть панель (к примеру карта) мне нужно при удержании мыши её двигать, с какой скоростью я двигаю мышью с той же скоростью двигается и панель (и все что на ней соответственно), то же самое должно быть и если пальцем по экрану вести.
Только суть заключается в перемещении самой панели, не камеры, вот именно саму панель нужно двигать.
С камерой получается, а вот с панелью кручу и что-то не получается, то летает, то координаты -z уходит, подскажите как сделать?
if(Input.GetMouseButton(0))
Двигается нормально, только вот при каждом новом нажатии панель центрируется, то есть там где я нажимаю мышкой там сразу устанавливается центр панели.
- Вопрос задан более двух лет назад
- 1883 просмотра
Перемещение объекта
Правильно ли я понял, что 1 — это линейное перемещение, 2 — перемещение с постоянным ускорением, 3 — перемещение с плавным увеличением скорости и плавной остановкой?
Отслеживать
задан 15 мая 2019 в 3:51
Владимир Михайлов Владимир Михайлов
29 1 1 серебряный знак 5 5 бронзовых знаков
Точно не помню в чем отличие,но операция GetComponent очень затратная и лучше ее не использовать когда нужно часто обращаться к объекту,а только когда 1 раз,например в функции Start()
15 мая 2019 в 4:45
transform.translate плохой способ, он нарушает состояние физ. движка..
15 мая 2019 в 5:22
1) движение способом перерысовывания 2) Движения способом изменения вектора скорости 3) Движение способом применения силы к объекту (толкая)
15 мая 2019 в 6:19
@ВиталийШебаниц, что такое «способ перерисовывания»?
– user302909
15 мая 2019 в 11:54
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Чтобы лучше ориентироваться в вопросе, посмотрите следующие 2 вопроса:
- Правильная реализация передвижения персонажа
- Движение с коллизией через Update и FixedUpdate, что такое “телепортация” в контексте физического движка в Unity?
Теперь кратко по вашему вопросу:
- Translate() — перемещение персонажа с помощью простого изменения его координаты, точнее сдвига позиции объекта, относительно его текущего положение. Это скорее не линейное перемещение, а «телепортация» объекта, так как объект резко меняет свое положение в пространстве. Это не физический способ перемещения, то есть прибегать к такому методу стоит только тогда, когда вы не используете физику для перемещения объекта, иначе могут случаться проблемы с коллизиями объектов (например несмотря на правильно настроенные Rigidbody и Collider один объект может застрять в другом. Кроме того, использовать такое перемещение стоит только в методе Update() , а не FixedUpdate() . Чем меньшее значение вы передадите в качестве параметра, тем менее «отрывистым» и плавным будет выглядеть ваше перемещение (но по факту, все-равно останется телепортацией)
- Rigidbody2D.velocity — мгновенное изменение скорости физического объекта. Стоит применять с осторожностью, так как может приводить к физически нереалистичному поведению. В целом, при использовании физики в Unity скорость объекта будет вычисляться с учетом всех сил, которые действуют на физическое тело и массы физического объекта. По этому, если получится так, что физический движок посчитает за вас скорость объекта по всем силам, которые на него действуют, а затем вы измените ее руками, по средствам изменения Rigidbody2D.velocity — это может выглядеть неправильно. К этому методу стоит прибегать только в исключительных случаях, когда надо резко изменить движение объекта (сами Unity в документации приводят пример с прыжком персонажа). Стоит применять только в FixedUpdate() , и ни в коем случае не в Update() , а также избегать изменения позиции персонажа ( transform.Translate() и изменение transform.position )
- Rigidbody2D.AddForce() — добавить действие силы к объекту. Как уже писал в предыдущем пункте, физический движок вычисляет скорость и направление движения объекта опираясь на силы, которые действуют на объект, а также его массу. При этом способе «разгон» физического объекта будет более плавным. Если провести аналогию — применение этого способа — как будто вы толкнули физический объект в определенном направлении. Стоит применять только в FixedUpdate() , и ни в коем случае не в Update() , а также избегать изменения позиции персонажа ( transform.Translate() и изменение transform.position )
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() следующим образом:
Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.

Предупреждение Скорее всего, пример, который вы ищете, был перемещен. Мы работаем над решением этой проблемы.
Позиционирование Объектов игры
Когда Вы собираете Вашу игру, Вы размещаете множество разных объектов в Вашем игровом мире.
- 1 Фокусирование
- 2 Перемещение, поворот и масштабирование
- 3 Переключатель отображения Гизмо
- 4 Единичный шаг привязок
- 5 Привязка к поверхности
- 6 Look-At вращение
- 7 Привязка к вершинам
Фокусирование [ ]
Может быть полезно сфокусировать камеру сцены на объекте перед манипулированием им. Выберите любой Объект и нажмите клавишу ‘F’. Это центрирует Окно сцены на объекте. Эта манипуляция называется Выбор рамки (Frame Selection).
Перемещение, поворот и масштабирование [ ]
Используйте инструменты трансформирования на панели инструментов для Перемещения, Вращения и Масштабирования отдельного Объекта игры. Каждому инструменту соответствует свой Гизмо, который появляется вокруг выбранного объекта в окне сцены. Вы можете использовать мышь и манипулировать любой осью Гизмо для выбора соответствующего компонента Transform, или Вы можете ввести значение напрямую в числовое поле в Инспекторе. Каждый из этих трех режимов трансформации может быть выбран горячей клавишей — W для Перемещения, E для Вращения и R для Масштабирования.

- Щелкните и потяните в центре Гизмо для манипуляции со всеми осями одновременно.
- В центре Гизмо перемещения есть три маленьких квадрата, которые могут быть использованы для перемещения объекта в той же плоскости (т.е. перемещение будет по двум осям одновременно, в то время как третья будет не затронута).
- Если у Вас трехкнопочная мышь Вы можете кликнуть среднюю кнопку для манипулирования по последней используемой оси (которая выделена желтым) без кликанья на самой оси.
- Будьте осторожны с инструментом масштабирования, т.к. неоднородное масштабирование (т.е. 1,2,1) может нежелательно масштабировать объекты детей.
- Для большей информации о трансформировании Объектов игры почитайте страницу Компонента Transform.
Переключатель отображения Гизмо [ ]
Этот переключатель используется для определения положения любого гизмо трансформаций.
![]()
- Позиция:
- Центр (Center) располагает Гизмо в центре ограничивающего объема рендерера объектов.
- Пивот (Pivot) позиционирует Гизмо в пивот точке меша.
- Локально (Local) ориентирует Гизмо по локальным осям объектов.
- Глобально (Global) привязывает Гизмо к ориентации мира.
Единичный шаг привязок [ ]

При перетаскивании за любую ось Гизмо Вы можете удерживать клавишу Ctrl/Comand для привязки изменений к установленным привязкам.
Вы можете изменить единичную дистанцию на которую будет производиться перемещение при включении привязки в меню Edit->Snap Settings.
Привязка к поверхности [ ]
Во время перетаскивания в центре при использовании инструмента Перемещение Вы можете удерживать Shift и Ctrl/Comand для привязки объекта к любому Коллайдеру. Это делает точное позиционирование объектов очень быстрым.
Look-At вращение [ ]
Во время использования интсрумента Вращение Вы можете удерживать Shift и Ctrl/Comand для поворота объекта на точку на поверхности любого Коллайдера. Это делает ориентацию объектов друг на друга проще.
Привязка к вершинам [ ]
Этот инструмент очень прост, но очень мощный. Он позволяет Вам взять любую вершину данного меша и мышкой перетащить эту вершину в позицию любой вершины другого меша.

Например, вы можете разместить дороги в гоночной игре с высокой точностью и добавить элементы питания на вершины меша.
Использование этого режима очень простое. Просто следуйте этим шагам:
- Выберите меш, которым Вы хотите манипулировать и проверьте, что включен нужный инструмент трансформаций.
- Нажмите и удерживайте клавишу V для активации режима.
- Передвиньте курсор на вершину Вашего меша, которую Вы хотите использовать как пивот.
- Нажмите левую кнопку мыши когда она над нужной вершиной и удерживая ее перетащите Ваш меш к другой вершине другого меша.
- Отпустите левую кнопку мыши и клавишу V когда будете удовлетворены результатом.
- Shift-V действует как переключатель этой функциональности.
- Вы можете привязывать вершину к вершине, вершину к поверхности и пивот к вершине.