Перемещение объекта мышкой с ограничением

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

Перемещение объекта мышкой с ограничением

Сообщение MrDmitry 23 сен 2021, 21:08

Здравствуйте, помогите решить казалось бы простую задачу. Нужно перемещать объект drag & drop в пределах поля. Для наглядности приложил картинку. Тут синий квадратик можно перемещать по левой стороне, в пределах всего поля, но нельзя переместить за пределы красной черты, черта может смещаться. Пробовал сделать что то типо того


Синтаксис:
Используется csharp
public void OnDrag(PointerEventData eventData)
    {
        Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        if (transform.position.x < wallPos)
            transform.Translate(mousePosition);

    }


где wallPos позиция красной черты, но понятное дело при достижении красной черты, он проходит ее и больше им не пошевелить. Задача вроде простая, но что то у меня в голову ни чего не приходит. Пробовал сделать через срабатывание триггеров, но тогда объект может проскакивать красную черту.

Изображение
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Перемещение объекта мышкой с ограничением

Сообщение samana 23 сен 2021, 21:32

Пока курсор по икс в левой части, то перемещайте квадрат за курсором.
А если курсор по икс в правой части, то перемешайте квадрат за курсором только по игрек, а икс устанавливайте в значение где проходит красная черта.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Перемещение объекта мышкой с ограничением

Сообщение MrDmitry 23 сен 2021, 21:46

Так я о чем и говорю, это первое что пришло мне в голову. Но

Синтаксис:
Используется csharp
if (transform.position.x <= wallPos)
            transform.Translate(mousePosition);
        else
            transform.Translate(new Vector2(wallPos, mousePosition.y));


Квадрат прилипает к красной черте и не смещается больше по оси X


PS понял, нужно следить за мышкой а не за объектом. заменил


Синтаксис:
Используется csharp
if (transform.position.x <= wallPos)
на

Синтаксис:
Используется csharp
if (mousePosition.x >= 0)


Но теперь проблема что квадрат не смещается за мышкой в обратном направлении. Происходит это, по всей видимости потому что координаты мышки считаются относительно самого квадрата.
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Перемещение объекта мышкой с ограничением

Сообщение MrDmitry 23 сен 2021, 22:03

Синтаксис:
Используется csharp
public void OnDrag(PointerEventData eventData)
    {
        Vector2  ObjectPosition= Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        if (mousePosition.x <= wallPos.x)
            transform.Translate(ObjectPosition);
        else
            transform.Translate(new Vector2(wallPos.x, ObjectPosition.y));
    }


На калякал такое. Теперь при достижении красной линии, квадрат улетает куда то за приделы (

Если я убираю позицию стены, и ставлю 0 за место wallPos.x то все нормально.
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Перемещение объекта мышкой с ограничением

Сообщение NICO 24 сен 2021, 04:39

MrDmitry писал(а):Так я о чем и говорю, это первое что пришло мне в голову. Но

Синтаксис:
Используется csharp
if (transform.position.x <= wallPos)
            transform.Translate(mousePosition);
        else
            transform.Translate(new Vector2(wallPos, mousePosition.y));


Квадрат прилипает к красной черте и не смещается больше по оси X


PS понял, нужно следить за мышкой а не за объектом. заменил


Синтаксис:
Используется csharp
if (transform.position.x <= wallPos)
на

Синтаксис:
Используется csharp
if (mousePosition.x >= 0)


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

Это происходит по той причине, что ежели выполняется первое if, то затем больше ничего не происходит. Эти коды выполняются в порядке от верхнего. Т. е. проверяется верхнее, выполняется действие, ежели нет, то ничего не происходит или выполняется то, что ниже в else if, чем выше, тем первостепеннее значение. Т. е. ежели в самом начале сказано If (что-то происходит), и ЭТО ПРОИСХОДИТ, то это действие выполняется, и все. else if даже не проверяется ниже. Первое выполнено. Все. Приехали.
Последний раз редактировалось NICO 24 сен 2021, 06:08, всего редактировалось 1 раз.
NICO
UNIт
 
Сообщения: 123
Зарегистрирован: 30 июл 2021, 23:30

Re: Перемещение объекта мышкой с ограничением

Сообщение NICO 24 сен 2021, 04:49

Не факт, что сработает, но попытайтесь таким образом:
Синтаксис:
Используется csharp
if (mousePosition.x <= 0)
            transform.Translate(mousePosition);
else if (mousePosition.x > 0)
            transform.Translate(new Vector2(wallPos, mousePosition.y));
 

Я же верно понимаю, что wallPos по мышке находится по оси x в точке 0?
NICO
UNIт
 
Сообщения: 123
Зарегистрирован: 30 июл 2021, 23:30

Re: Перемещение объекта мышкой с ограничением

Сообщение NICO 24 сен 2021, 05:05

NICO писал(а):Не факт, что сработает, но попытайтесь таким образом:
Синтаксис:
Используется csharp
if (mousePosition.x <= 0)
            transform.Translate(mousePosition);
else if (mousePosition.x > 0)
            transform.Translate(new Vector2(wallPos, mousePosition.y));
 

Я же верно понимаю, что wallPos по мышке находится по оси x в точке 0?

Пардон, только что заметил, что wallPos тоже может смещаться, значит, везде вместо 0 пропишите wallPos. Мне кажется, должно сработать:
Синтаксис:
Используется csharp
if (mousePosition.x <= wallPos)
            transform.Translate(mousePosition);
else if (mousePosition.x > wallPos)
            transform.Translate(new Vector2(wallPos, mousePosition.y));
 
NICO
UNIт
 
Сообщения: 123
Зарегистрирован: 30 июл 2021, 23:30

Re: Перемещение объекта мышкой с ограничением

Сообщение Tolking 24 сен 2021, 16:24

Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9