forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D/GUI (http://forum.boolean.name/forumdisplay.php?f=167)
-   -   Перетаскивание элементов GUI (http://forum.boolean.name/showthread.php?t=14471)

Nazgul 25.03.2011 18:31

Перетаскивание элементов GUI
 
Необходимо перетаскивать по экрану элементы GUI с помощью мыши, типа Drag and Drop. Нажали на элемент левой кнопкой мыши - удерживая левую кнопку мыши, перетаскиваем элемент - отпускаем левую кнопку мыши. Подскажите каким образом можно это реализовать.
И еще вопросик: Как отследить событие, когда щелкаем на определенный элемент GUI (на любой)?

pax 25.03.2011 18:53

Ответ: Перетаскивание элементов GUI
 
Сегодня отвечал на похожий вопрос: http://forum.boolean.name/showpost.p...&postcount=381

Nazgul 25.03.2011 19:13

Ответ: Перетаскивание элементов GUI
 
Я такой код написал:
Код:

EventType cur = Event.current.type;
if(cur == EventType.MouseDrag){
      if(dpt.pos.Contains(Event.current.mousePosition))
          //Реализовать перетаскивание элемента GUI
}

А как перетаскивание реализовать? Можно пример кода?:)

pax 25.03.2011 19:22

Ответ: Перетаскивание элементов GUI
 
Вот так не получается?
PHP код:

dpt.pos.dpt.pos.Event.current.delta.x;
dpt.pos.dpt.pos.Event.current.delta.y


Nazgul 25.03.2011 19:34

Ответ: Перетаскивание элементов GUI
 
Спасибо!! Все получилось:) А что за такой параметр delta?

pax 25.03.2011 19:40

Ответ: Перетаскивание элементов GUI
 
на сколько мышь сместилась с прошлого эвента

Nazgul 25.03.2011 20:06

Ответ: Перетаскивание элементов GUI
 
Хм, опять проблемка. Элемент GUI как бы не успевает двигаться за курсором. Нужно оочень медленно курсор двигать, чтобы элемент GUI передвигался.

Nazgul 26.03.2011 10:19

Ответ: Перетаскивание элементов GUI
 
В общем написал такую функцию:
Код:

protected void Drag(){
        EventType cur = Event.current.type;
                if(cur == EventType.MouseDrag){
                        if(flag){
                                if(pos.Contains(Event.current.mousePosition)){
                                        pos.x = pos.x + Event.current.delta.x;
                                        pos.y = pos.y + Event.current.delta.y;
                                        flag = false;
                                }
                        } else if(new Rect(pos.x-200,
pos.y-200,pos.width+400,pos.height+400).Contains(Event.current.mousePosition)){
                                      pos.x = pos.x + Event.current.delta.x;
                                        pos.y = pos.y + Event.current.delta.y;
                        }
                }
                if(cur == EventType.MouseUp){
                        if(pos.Contains(Event.current.mousePosition))
                                flag = true;
                }
               
        }

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

moka 26.03.2011 15:28

Ответ: Перетаскивание элементов GUI
 
Учитываются не локальные координаты элемента, и мышки. Возможно нужно отнять от позиции на которую двигаешь, координату окна, таким образом элемент будет двигаться с учётом локальных координат в окне. Если двигать нужно даже в локальных координатах контроллера ребёнком которого он является, то нужны тогда пере вычисления. Догадки.

pax 26.03.2011 15:48

Ответ: Перетаскивание элементов GUI
 
Что-то у всех мания сложности изобретать))

PHP код:

using UnityEngine;

public class 
DragTest MonoBehaviour
{

    public 
Rect pos = new Rect(20,20,200,200);

    private 
bool _drag false;

    public 
void OnGUI()
    {
        
GUI.Box(pos"Тащи меня");

        var 
evtType Event.current.type;
        var 
mousePos Event.current.mousePosition;

        if (
evtType == EventType.MouseDown && pos.Contains(mousePos))
        {
            
_drag true;
        }
        else if (
evtType == EventType.MouseUp && pos.Contains(mousePos))
        {
            
_drag false;
        }
        else if (
evtType == EventType.MouseDrag && _drag)
        {
            
pos.+= Event.current.delta.x;
            
pos.+= Event.current.delta.y;
        }
    }





Nazgul 26.03.2011 19:07

Ответ: Перетаскивание элементов GUI
 
Pax, проблема осталась. Запускаю из Юнити - все норм, а из билда(в броузере) - не работает. Пытаюсь вот сделать так, как Мока посоветовал.
Решил отследить значения Event.current.delta.x и Event.current.delta.y, выводя их в Label при попытке передвижения окошка по экрану. Такие значения(соответственно, delta.x и delta.y):211 88, 535 267, 1091 532. По идее значения должны быть маленькими..
Я вообще понять не могу, какая разница запускать проект в Юнити или из билда.

pax 26.03.2011 19:53

Ответ: Перетаскивание элементов GUI
 
Похоже на багу Unity. Тогда такой костыль:

PHP код:

using UnityEngine;

public class 
DragTest MonoBehaviour
{
    public 
Rect pos = new Rect(20,20,200,200);
 
    private 
bool _drag false;

    private 
Vector2 _lastMousePos;

    public 
void OnGUI()
    {
        
GUI.Box(pos"Тащи меня");
 
        var 
evtType Event.current.type;
        var 
mousePos Event.current.mousePosition;
 
        if (
evtType == EventType.MouseDown && pos.Contains(mousePos))
        {
            
_drag true;
            
_lastMousePos mousePos;
        }
        else if (
evtType == EventType.MouseUp && pos.Contains(mousePos))
        {
            
_drag false;
        }
        else if (
evtType == EventType.MouseDrag && _drag)
        {
            var 
delta mousePos _lastMousePos;
            
pos.+= delta.x;
            
pos.+= delta.y;
            
_lastMousePos mousePos;
        }
    }
 
 



Кстати, какая версия Unity?

Nazgul 26.03.2011 20:08

Ответ: Перетаскивание элементов GUI
 
Заработало походу! Спасибо) Версия 3.0.0f5


Часовой пояс GMT +4, время: 01:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot