alex4answ
@alex4answ

Перемещение влево-вправо летящего объекта мышкой?

Добрый день, есть куб, который движется по Z и Y координате, движение задается приложением силы (addForce), камера закреплена за объектом.

мне нужно передвигать этот летящий объект вправо-влево по касанию/свайпу, не совсем представляю как это сделать, но пока думаю вот так:

Скрипт на объекте, сила прикладывается по клику на кнопку.
Update(){
 if(Input.GetMouseButtonDown(0)){
      transform.position = new Vector3(Input.mousePosition.x, transform.position.y, transform.position.z);
  }
}

Но мне это кажется диким костылем, менять каждый кадр позицию, когда позиция рассчитывается уже движком из-за приложение силы.

+ это попросту не работает, тк Input.mousePosition.x зависит от экрана и имеет очень большую величину.

Подскажите, будьте добры, за любую подсказку/направление буду очень благодарен
  • Вопрос задан
  • 333 просмотра
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
в принципе подход и мысли более менее верные.
единственное обычно надо бы брать не координату мыши или тача, а его отклонение.
смотря какая у вас механика..по нажатию или всегда..
условно если всегда,то смотрим какие у мыши координаты.
на сколько они от середины экрана.
размер экрана тоже знаем.
и вот вуаля..у нас есть 10 процентов вправо от середины..или 95 процентов от середины экрана влево.

отсюда мы берем коэффициент скорости. и направление)
условно от - 1 до 1. где (-1) = движемся максимально быстро влево. ,а 1 - соответственно вправо)

и выйдет что то вроде
transform.position = new Vector3( transform.position.x+SpeedFactor*Time.deltaTime*playerSpeed, transform.position.y, transform.position.z);

где SpeedFactor то самое направление от -1 до 1. а playerSpeed - просто дополнительный множитель для удобства контроля в редакторе вынесенный.
умножение на Time.deltaTime позволяет адекватно управлять. сгладить в независимости от частоты кадров)
если у вас было до этого "смещать на N пикселей каждый кадр".
то теперь будет равномерное "смещать на N пикселей в секунду", что куда удобнее воспринимается и адекватнее себя ведет))

а насчет движения. тут уже отдельная тема. если движется вперед силой, то в принципе можете пробовать двигать силлой добавляя еще одну вправо или влево.
но придется учесть что без трения и соприкосновения она сама не будет прекращать воздествовать)
так что когда ввода нет ли достигло края полосы(допустим границы экрана) вам ручками обрезать скорость боковую.
напрямую контролирую velocity у Rigitbody.

В принципе ничего не мешает и перемещение оставить так, просто меняя позицию. только просто заменить напрямую обращение к трансформу на https://docs.unity3d.com/ScriptReference/Rigidbody...
почитайте в чем разница. в доке более менее все описанно)

надеюсь стало хоть чуток понятнее)))
как найти размер экрана. и прочее подобное по мелочи - погуглить думаю выйдет)
удачи.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы