Страница 1 из 1

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

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

Заранее благодарен!

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

СообщениеДобавлено: 19 ноя 2017, 21:24
samana
Что-то я так и недопонял ситуацию с точками.
Pivot изменить нельзя, но можно положить объект в пустого родителя и отцентровать объект относительно этого родителя как угодно. Перемещать естественно уже родителя.

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

СообщениеДобавлено: 19 ноя 2017, 21:25
Anonymyx
Может это глупый костыль, но можете создать просто пустой оъект перемещать и в точку попадания и удочерять нужный объект этому пустому объекту, и двигать этот пустой объект.
А так, можно высчитать расстояние от точки попадания то пайвота и принять за смещение. Как-то так...
О, кажись не глупый.

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);
                }
        }
 

Если кому не трудно, можете проверить у себя.

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

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

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

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

То есть, если я объявлю RaycastHit глобальной переменной, многое изменится? Не понимаю твоей логики.

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

СообщениеДобавлено: 20 ноя 2017, 13:13
Киборг
Anonymyx писал(а):И зачем создавать new Vector3? hit.point и есть Vector3.

Чтобы объект не перемещался по оси Y.

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

СообщениеДобавлено: 20 ноя 2017, 13:23
Anonymyx
Стрельнули лучем, начали лерпить.

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

Щяс занят, позже кодом объясню. Если еще актуально будет.

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

Так что, не думай, что я до такой степени нуб) Просто встречаются иногда надоедливые баги.
Я сам не думал, что мне на этот раз придётся сюда обращаться.

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.
Кто хочет предложить свой вариант, пожалуйста!

А так, всем спасибо. Проблема решена!

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

СообщениеДобавлено: 21 ноя 2017, 15:02
Anonymyx
А что, при смене имени метода изменится функционал?)))

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

На любом приличном форуме\вопроснике по программированию за очень плохой стиль написания кода.

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

СообщениеДобавлено: 21 ноя 2017, 18:19
Киборг
Anonymyx писал(а): за очень плохой стиль написания кода.

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

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