Движение объекта в точку пересечения с лучом

Программирование на Юнити.

Движение объекта в точку пересечения с лучом

Сообщение Киборг 19 ноя 2017, 18:50

Доброго времени суток.
Пишу игру в жанре RTS. Создал скрипт для перемещения объекта за курсором мыши. Реализовал такую логику:
При перемещении курсора бросается луч, затем луч попадает в ландшафт, где пересекается с ним. Объект перемещается в точку пересечения.
Но проблема такова, если я нажимаю на 3D объект, к примеру, сбоку, он сразу перемещается в ту точку. То есть центр объекта перемещается в ту точку. А как мне сделать так, чтобы при нажатии на любую точку объекта, эта точка и становилась его центром или pivot point?

Заранее благодарен!
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Движение объекта в точку пересечения с лучом

Сообщение samana 19 ноя 2017, 21:24

Что-то я так и недопонял ситуацию с точками.
Pivot изменить нельзя, но можно положить объект в пустого родителя и отцентровать объект относительно этого родителя как угодно. Перемещать естественно уже родителя.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Движение объекта в точку пересечения с лучом

Сообщение Anonymyx 19 ноя 2017, 21:25

Может это глупый костыль, но можете создать просто пустой оъект перемещать и в точку попадания и удочерять нужный объект этому пустому объекту, и двигать этот пустой объект.
А так, можно высчитать расстояние от точки попадания то пайвота и принять за смещение. Как-то так...
О, кажись не глупый.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Движение объекта в точку пересечения с лучом

Сообщение Киборг 20 ноя 2017, 12:56

Ваши варианты перепробовал ещё до создания темы.
Насчёт родительского объекта, срабатывает, но меня интересует другой метод (математический).
Пробовал, но работает некорректно.
Вот метод:
Синтаксис:
Используется csharp
public void Transform(Vector3 pos){
                Ray ray = Camera.main.ScreenPointToRay (pos);
                RaycastHit hit;
                if (Physics.Raycast (ray, out hit)) {
                        Vector3 _pos = new Vector3 (hit.point.x, transform.position.y, hit.point.z);
                        transform.position = Vector3.Lerp (transform.position, new Vector3(_pos.x - transform.position.x, _pos.y, _pos.z - transform.position.z), acceleration);
                }
        }
 

Если кому не трудно, можете проверить у себя.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Движение объекта в точку пересечения с лучом

Сообщение Anonymyx 20 ноя 2017, 13:06

А откуда и когда вызывается метод? И почему имя метода == Transform? Вас бы за такое в определенных кругах помидорами закидали бы.
У вас RaycastHit локальная переменная, и при каждом вызове обнуляется (создается заново), и поэтому Lerp() тут неуместен (или вы всегда должны следить за объектом лучем).
Кстати, как раз хотел предложить лерпить объект к точке, обычно так в UI делается когда берется предмет из инвентаря... Выглядит красиво!
И зачем создавать new Vector3? hit.point и есть Vector3.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Движение объекта в точку пересечения с лучом

Сообщение Киборг 20 ноя 2017, 13:11

Anonymyx писал(а):А откуда и когда вызывается метод? И почему имя метода == Transform? Вас бы за такое в определенных кругах помидорами закидали бы.
У вас RaycastHit локальная переменная, и при каждом вызове обнуляется (создается заново), и поэтому Lerp() тут неуместен (или вы всегда должны следить за объектом лучем).
Кстати, как раз хотел предложить лерпить объект к точке, обычно так в UI делается когда берется предмет из инвентаря... Выглядит красиво!

То есть, если я объявлю RaycastHit глобальной переменной, многое изменится? Не понимаю твоей логики.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Движение объекта в точку пересечения с лучом

Сообщение Киборг 20 ноя 2017, 13:13

Anonymyx писал(а):И зачем создавать new Vector3? hit.point и есть Vector3.

Чтобы объект не перемещался по оси Y.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Движение объекта в точку пересечения с лучом

Сообщение Anonymyx 20 ноя 2017, 13:23

Стрельнули лучем, начали лерпить.

Насчет new Vector3 - не заметил, извиняюсь.
Не знаю когда вызывается ваш метод...
В общем, пускаете луч, если попали - запоминаете объект в который попали, начинаете лерпить его за мышкой в Update() или запускаете корутину и в нем лерпите.

Щяс занят, позже кодом объясню. Если еще актуально будет.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Движение объекта в точку пересечения с лучом

Сообщение Киборг 20 ноя 2017, 13:35

Anonymyx писал(а):А откуда и когда вызывается метод? И почему имя метода == Transform?

В Update! Где ж ещё. Я использую NGUI.
Синтаксис:
Используется csharp
if(UICamera.selectedObject == this.gameObject){
    Transform(Input.mousePosition);
}
 

Суть в том, что если я нажму на этот объект один раз (то есть выберу/переключусь на него), постоянно будут пускаться лучи, и объект будет перемещаться в точку пересечения. Думаю от того, как вызывается метод тут немногое зависит.
Anonymyx писал(а):И почему имя метода == Transform?

А что, при смене имени метода изменится функционал?)))
Anonymyx писал(а):Вас бы за такое в определенных кругах помидорами закидали бы.

Примерно где и за что?

Слушай, я сам понимаю, что вопрос немного туповат, тем более, что я раньше не занимался RTS играми.
Я больше шутерами увлекался.

Вот, взгляни (моя игрушка для портфолио):
http://www.cyberforum.ru/unity/thread1935677.html

Так что, не думай, что я до такой степени нуб) Просто встречаются иногда надоедливые баги.
Я сам не думал, что мне на этот раз придётся сюда обращаться.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Движение объекта в точку пересечения с лучом

Сообщение Киборг 20 ноя 2017, 16:52

Разобрался. Добавил эти строки кода:
Синтаксис:
Используется csharp
screenPosition = Camera.main.WorldToScreenPoint(target.transform.position);
offset = target.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z));
 

Ошибка была в том, что я неправильно вычислял offSet.
Кто хочет предложить свой вариант, пожалуйста!

А так, всем спасибо. Проблема решена!
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Движение объекта в точку пересечения с лучом

Сообщение Anonymyx 21 ноя 2017, 15:02

А что, при смене имени метода изменится функционал?)))

Нет, но есть определенные правила написания кода. А называть методы именем класса крайне некорректно, причем класс который встречается на каждом углу. Подобным образом определяют конструкторы.
Примерно где и за что?

На любом приличном форуме\вопроснике по программированию за очень плохой стиль написания кода.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Движение объекта в точку пересечения с лучом

Сообщение Киборг 21 ноя 2017, 18:19

Anonymyx писал(а): за очень плохой стиль написания кода.

ОК. Понял. Постараюсь поменьше писать говнокод.

ИМХО, прогеры с хорошим стилем написания кода не будут сидеть на форумах, максимум отвлекутся на минутку.
А те, кто и будут "кидаться помидорами" за это, либо не хотят показаться не знающими, либо сами по себе базарные бабы (и опять же не познавшие многого).
Не будем спорить об этом)) Это моё мнение, может ты думаешь, иначе. Удачи!)
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 14