следование объекта за мышью
Здравствуйте! совсем недавно начал изучать Юнити.
Начал писать скрипт по передвижению объекта с помощью мыши в плоскости. Т.е. нажал на объект и начинаешь передвигать мышь, а он за ней. Каким образом это реализовать? |
Ответ: следование объекта за мышью
Смотри в Scripting Reference:
Transform.Position Transform.Move Vector3.MoveTowards Input.GetAxis (+ Reference и Manual по Input) Physics.RayCast (как вариант) MonoBehaviour.OnMouseDrag В общем логика такая: Пока юзер держит мышу на объекте - перемещаем объект вместе с мышой, для чего определяем "целевую" координату либо райкастом по плоскости, либо исходя из перемещения мыши (такой вариант годен, когда курсор скрывается на время перемещений объектов, ибо можно нипапасть). А перемещение объекта - это либо прямое позиционирование в точку попадания райкаста, либо смещение через модификацию позиции/специальный метод Move, либо извращенно-утонченное интерполирование между двух координат через класс Vector3. Выбирай наиболее подходящий вариант и читай справку. |
Ответ: следование объекта за мышью
Спасибо)
перед тем как писать перемещение мышью, я хотел написать "активацию объекта", т.е. надимаем на нужный объект, а он взлетает на несколько сантиметров вверх. Дак вот, я написал этот скрипт. Команду по плавному перемещению из точки в точку, кроме Vector3.Slerp, я не нашёл. Но и Slerp не работает. Он мнгновенно перемещает. Пришлось писать цикл, чтобы перемещение казалось плавным, т.е. перемещается по чуть-чуть. Но этот скрипт не работает. Посмотрите пожалуйста в чём дело? А также предложите команды по плавному перемещению. PHP код:
|
Ответ: следование объекта за мышью
Цитата:
Шаг 1. Юнити выполняет свою внутреннюю логику. Шаг 2. Юнити пробегает по событиям и обнаруживает, что игрок держит кнопку мыши над объектом. Шаг 3. Юнити передаёт бразды правления твоему скрипту. Шаг 4. Твой скрипт 50 раз сферически интерполирует позицию объекта. Шаг 5. Юнити отрисовывает сцену. Собственно, "почему так" ты сейчас должен понять. Подскажу как исправить: Когда игрок кликает по объекту, тебе стоит устанавливать некоторую переменную-таймер, а потом в Update() (или FixedUpdate()) проверять, включен ли этот таймер или нет (сравнивая с текущим временем, например), и если таки да - чуть-чуть двигать объект. Один шажочек за один такт. Цитата:
Vector3.MoveTowards Vector3.SmoothDamp Любая из них. Проще всего работать будет со второй. Выглядеть будет так (JS): Код:
transform.position = Vector3.MoveTowards(transform.position, destination_vector3, max_speed*Time.deltaTime); Потому что так мы можем задавать переменную max_speed в еденицах в секунду. Это очень удобно, на мой взгляд, очень человекоориентированно. Нюанс: если мы эти действия совершаем в FixedUpdate, то использовать нужно Time.fixedDeltaTime. |
Ответ: следование объекта за мышью
Спасибо за команды, но я так и не понял почему мой код не работает.
Что за переменная - таймер? в Скрипт Референсе (unity3d.com) "timer" не нашёл |
Ответ: следование объекта за мышью
MoveTowards не даёт плавных результатов. Я имел в виду: нажимаешь кнопку(1 раз), и объект плавно , без рывков, движется к цели
|
Ответ: следование объекта за мышью
Цитата:
Цитата:
А надо так:
|
Ответ: следование объекта за мышью
Добавлю:
У тебя цикл вообще ни разу не выполняется. Чтобы цикл выполнялся 50 раз нужно вместо этого: Код:
for (int i = 1; i > 50; i++) Код:
for (int i = 0; i < 50; i++) |
Ответ: следование объекта за мышью
спасибо за объяснение
ошибку нашёл стыдно уже такие вопросы спрашивать :) |
Ответ: следование объекта за мышью
написал часть скрипта. Как только появляется мышка на экране, сразу же начинает перемещаться объект. В сцене 2 перпендикулярно поставленные плоскости. Мышка по ним скользит - по ним же скользит объект.
Но дело в том, что по вертикальной плоскости объект движется более-менее нормально(иногда плавно движется от камеры к плоскости), а по горизонтальной скачет от камеры к точке на плоскости с большущей частотой. Раньше объект скакал и по вертикальной плосскости, но после включения isKinematic почти перестал. А ещё до этого объект крутился в разные стороны - решилось строчками: Quaternion deltaRotation = Quaternion.Euler(rot); rigidbody.MoveRotation(deltaRotation); как это исправить? скрипт: PHP код:
|
Ответ: следование объекта за мышью
Цитата:
Если я прав, вылечить просто. В юнити есть такая штука, как слои. Слои могут быть использованы, чтобы селективно вырубить (или врубить) объекты из(в) райкаста/рендера/ещё-какой-нибудь-хрени. Тебе нужно либо делать райкаст только по слою, на котором твоя плоскость, либо делать райкаст по всем слоям кроме того, на котором твой объект. Тут зависит от задачи, в общем-то, и дополнительной нагрузки на другие слои (если таковые имеются/планируются)... |
Ответ: следование объекта за мышью
Спасибо) Буду ковырять их
|
Ответ: следование объекта за мышью
Вложений: 1
убрал на другой слой, всё пришло в норму.
теперь делаю, чтобы луч выпускался только по нажатию ЛКМ. Сделал, запускаю - пишет, что нет коллайдера у объекта. А мой объект из составных коллайдеров, а объект родитель коллайдера не имеет вовсе. Если добавить родителю коллайдер, то вовсе нет реакции никакой. Дайте пожалуйста совет, что с этим делать? Код тот же. Нет ВРУ! новый: PHP код:
Скрин с составного объекта: |
Ответ: следование объекта за мышью
Цитата:
Если да, то PHP код:
|
Ответ: следование объекта за мышью
pax, спасибо за скрипт, но дело было не в этом.
Дело было в том, что я объект Колба переместил на слой "Ignore Raycast". После этого коллайдеры стали невосприимчивыми к мышке. Каким образом сделать коллайдеры восприимчивыми к мышке, а объект заставить игнорировать Лучи? |
Часовой пояс GMT +4, время: 15:36. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot