GUI взаимное перекрытие элементов

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

GUI взаимное перекрытие элементов

Сообщение Guyver 14 сен 2010, 11:54

добрый день.

пытаюсь реализовать класс выполняющий роль ComboBox.
в крации принцип работы:
рисуем Button. по клику на этот Button ниже появляется Box, с SelectionGrid. смотрим что вернул SelectionGrid, если чтото выбрали сворачиваем Box и всё что в нём ...

проблема в том, что если ComboBox разворачивается над другими элемантами формы (например кнопки), то нажатия обрабатываются как элементами selectionGrid`а так и кнопками под ним.

есть ли возможность сообщить Юньке, что этот контрол верхний и что обрабатывать элементры под ним нестоит?

спасибо.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: GUI взаимное перекрытие элементов

Сообщение Zaicheg 14 сен 2010, 12:09

Как вариант — при выводе "верхнего" элемента ставить некий флаг в true. И при этом флаге не выполнять действия по нижнему элементу.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: GUI взаимное перекрытие элементов

Сообщение Neodrop 14 сен 2010, 12:38

Можно так же отрисовать SelectionGrid в окне поверх этого окна.
Если не нужно само окно, как визуальный элемент, ему можно назначить другой или вовсе пустой стиль.
Окно гарантировано отрубит возможность нажать что-то, находящееся под ним.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: GUI взаимное перекрытие элементов

Сообщение Guyver 14 сен 2010, 12:39

2 Zaicheg
это вариант ..

но там тупо не красиво получается даже просто реакция кнопочки под менюшкой на OnMouseOver смену изображения кнопки (ну смена состояния кнопки OnOver, OnDown и тд ...).. просто теряешся на что ты сейчас нажмёш ... не по взрослому это както )))

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


2Neo
этот подход уже по взрослому )))
чёт я не додумался до стиля пустого для окна...
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: GUI взаимное перекрытие элементов

Сообщение Zaicheg 14 сен 2010, 12:46

Guyver писал(а):но там тупо не красиво получается даже просто реакция кнопочки под менюшкой на OnMouseOver смену изображения кнопки (ну смена состояния кнопки OnOver, OnDown и тд ...).. просто теряешся на что ты сейчас нажмёш ... не по взрослому это както )))

Просто по флагу ставите кнопке стиль, не предполагающий изменения её внешнего вида по состояниям.
Но способ Неодпропа удобнее.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: GUI взаимное перекрытие элементов

Сообщение Neodrop 14 сен 2010, 12:55

Не, в первом варианте никаких стилей менять не нужно. Достаточно по флагу поставить GUI.enable = false для кнопок снизу. И всё. Они ни на что не будут реагировать и станут полупрозрачными автоматом.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: GUI взаимное перекрытие элементов

Сообщение Zaicheg 14 сен 2010, 13:30

Neodrop писал(а):Не, в первом варианте никаких стилей менять не нужно. Достаточно по флагу поставить GUI.enable = false для кнопок снизу. И всё. Они ни на что не будут реагировать и станут полупрозрачными автоматом.

Не встречал такой фишки. И в референсе не вижу. Это как делается? Кусок кода было бы круто )
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: GUI взаимное перекрытие элементов

Сообщение DbIMok 14 сен 2010, 14:24

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: GUI взаимное перекрытие элементов

Сообщение Guyver 15 сен 2010, 10:57

Вот накидал модулёк ComboBox..
он далёк от совершенства и есть пару костылей но в общем наверно можно использовать если вдруг пригодится кому ...
если кто сможет придать изящности и универсальности коду и запостит .. буду рад.

Код: Выделить всё
using UnityEngine;
using System;
using System.Collections;

public class ComboBoxUIControl
{
   public String[] menuItems;
   public String mySelectedItem;
   public int     mySelectedIndex = 0;
   public GUIStyle customButton;
   public GUIStyle customSelectionGrid;

   private Vector2 scrollPosition;
   private bool showMenu = false;

   public string Paint(Rect wRect, float parentX, float parentY, int winID)
   {
      Rect winRect = new Rect (wRect.x+parentX, wRect.y + wRect.height + parentY, 150, 60);
      if(GUI.Button(wRect, mySelectedItem)) //, customButton))
      {
         showMenu = !showMenu;
      }
   
      if(showMenu)
      {         
         winRect = GUI.Window(winID, winRect, EmptyWindowHandler, "", new GUIStyle());
         GUI.BringWindowToFront (winID);         
      }
      return mySelectedItem;
   }
   
   void EmptyWindowHandler(int windowID)
   {
      GUI.Box(new Rect ( 0, 0, 150, 60 ), "");
      GUILayout.BeginArea(new Rect ( 0, 0, 150, 60 ));
      scrollPosition = GUILayout.BeginScrollView(scrollPosition);
      mySelectedIndex = GUILayout.SelectionGrid(mySelectedIndex, menuItems, 1);//, customSelectionGrid);

      if (mySelectedItem != menuItems[mySelectedIndex])
      {
         mySelectedItem = menuItems[mySelectedIndex];
         showMenu = false;
      }
      
      GUILayout.EndScrollView();
      GUILayout.EndArea();
   }
}


вот таким макаром вызывать

Код: Выделить всё
гдето в инициализации
...
...
сomboBox = new ComboBoxUIControl();
сomboBox.menuItems = new string[3];
сomboBox.menuItems[0] = "item1";
сomboBox.menuItems[1] = "item2";
сomboBox.menuItems[2] = "item3";
сomboBox.mySelectedItem = сomboBox.menuItems[0];
...

гдето в отрисовке
...
comboValue = comboBox.Paint(new Rect(120, 128, 104, 21), windowRect.x, windowRect.y, 20);
...


например если кто знает ..
можно ли автоматом получить свободное ID окна и не указывать каждый раз руками ?
можно ли узнать абсолютные координаты элемента автоматом ... не складывая координаты всех его родителей...
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск


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

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

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