Проблемма в создании навигации с помощью GUI

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

Проблемма в создании навигации с помощью GUI

Сообщение Nevers 25 фев 2011, 17:15

Требуется сделать чтобы при нажатии на кнопку, появлялась текст.
Вот код.
Синтаксис:
Используется javascript
//@script ExecuteInEditMode()

function OnGUI()
{
       
        if (GUI.Button(Rect(50,50,100,25),"Кнопка 2")){
                GUI.TextArea (Rect (200, 50, 200, 100), "Test 1", 200);
        }
}
 


Кнопка отображается, но при нажатии текстовая ария не рисуется. Хотя если её отдельно рисовать, то она будет. Что я не так делаю? Подскажите пожалуйста.
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16

Re: Проблемма в создании навигации с помощью GUI

Сообщение Nevers 25 фев 2011, 17:33

Cделал так. Заработало.

Синтаксис:
Используется javascript
var pPos = 1;

function OnGUI()
{      
        if (GUI.Button(Rect(50,50,100,25),"Кнопка 2")){
                pPos = 2;
                //GUI.TextArea (Rect (200, 50, 200, 100), "Test 1", 200);
        }
       
        if (pPos == 2) {
                GUI.TextArea (Rect (200, 50, 200, 100), "Test 1", 200);
        }
}
 


Но вот что мне не понятно. Если функция OnGUI отрабатывает после каждого фрейма, то и кнопка по идее должна создаваться каждый раз новая, поверх старой. Но такого не происходит. По какому принципу происходит обработка этого события, кто знает?
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16

Re: Проблемма в создании навигации с помощью GUI

Сообщение DbIMok 25 фев 2011, 17:35

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

Re: Проблемма в создании навигации с помощью GUI

Сообщение discouraged_one 25 фев 2011, 17:39

http://unity3d.com/support/documentatio ... utton.html
TextArea будет рисоваться один кадр
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблемма в создании навигации с помощью GUI

Сообщение Nevers 25 фев 2011, 17:51

Еще такой есть вопрос. Можно ли изменить рендер GUI. Поясню, мне нужно чтобы интерфейс появлялся на экране не мгновенно, а проявлялся. Пытался найти в манах, но чет вижу фигу. Подскажите пожалуйста.
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16

Re: Проблемма в создании навигации с помощью GUI

Сообщение discouraged_one 25 фев 2011, 18:03

Нарисуйте поверх черный rect и меняйте ему альфу 8)
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблемма в создании навигации с помощью GUI

Сообщение Nevers 25 фев 2011, 18:08

Не пойдет. У меня будут выскакивать информационные окошки. При этом мне нужно будет чтобы это окно проявилось. А вот интерфейс стал постепенно невидим. Как можно получить ссылку на объект текстуры GUI элемента?
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16

Re: Проблемма в создании навигации с помощью GUI

Сообщение Woolf 25 фев 2011, 18:19

Вы неверно представляете себе механику работы гуя.

Вот так будет правильно

Синтаксис:
Используется javascript
var flag=false;
function OnGUI()
{
       
        if (GUI.Button(Rect(50,50,100,25),"Кнопка 2")){
              flag=true;
        }

      if (flag) {
        GUI.TextArea (Rect (200, 50, 200, 100), "Test 1", 200);
     }
}
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Проблемма в создании навигации с помощью GUI

Сообщение Nevers 25 фев 2011, 18:51

Спасибо за ваши ответы. Теперь мне лучше понятна механика работы Гуя. Теперь назрели такие вопросы, на которые я пока не нашел ответа.

1. Как заставить ГУЙ отрисовывать элементы только при запуске функции пользователем, а не каждый фрейм.
2. По умолчанию ГУЙ удаляется все элементы перед каждой отработкой события onGui?
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16

Re: Проблемма в создании навигации с помощью GUI

Сообщение discouraged_one 25 фев 2011, 19:04

1. Как заставить ГУЙ отрисовывать элементы только при запуске функции пользователем, а не каждый фрейм.

в OnGUI проверяйте что вам надо и выходите
2. По умолчанию ГУЙ удаляется все элементы перед каждой отработкой события onGui?

в Unity исмользуется Immediate Mode GUI (IMGUI) - он ничего не создает (и не удаляет естественно)
EDIT: считайте что всё что вы пишете в OnGUI существует только внутри этой ф-ии, как только вы из нее выходите ничего как будто и не было
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблемма в создании навигации с помощью GUI

Сообщение Nevers 25 фев 2011, 20:37

Вот что получилось в итоге.

Синтаксис:
Используется javascript
//@script ExecuteInEditMode()
private var alpha:Array = new Array();

function Start(){
        alpha[0] = Array(0,true,false);
        alpha[1] = Array(0,true,false);
}

function Update(){
        var i=0;
        for (i=0;i<=alpha.length-1;i++){
                if (alpha[i][2]) {
                        if (alpha[i][1]) {
                                if (alpha[i][0]  < 1) {
                                        alpha[i][0] = Mathf.Lerp(0,1,alpha[i][0]+0.01);
                                }
                        }
                        else{
                                if (alpha[i][0]  > 0) {
                                        alpha[i][0] = Mathf.Lerp(0,1,alpha[i][0]-0.01);
                                }
                                else {
                                        alpha[i][2] = false;
                                }
                        }
                }
        }
}

function OnGUI(){
        alpha[0][2] = true;
        GUI.color.a = alpha[0][0];
        if(GUI.Button(Rect(0,0,100,20),"FadeOutGUI")){
                if (alpha[1][2] == false) {
                        alpha[1][2] = true;
                        alpha[1][1] = true;
                }
                else {
                        alpha[1][1] = false;
                }
        }
       
        if (alpha[1][2]) {
                GUI.color.a = alpha[1][0];
                GUI.Label(Rect(100,0,100,20),"FadeOutGUI");
        }
}
 


Данный скрипт позволяет показывать различные объекты навигации, используя проявлении и постепенное исчезновение. Осталось сделать еще чтобы появлялось и исчезало за определенное время. И будет самое-то.
p.s. Выложил для ознакомления. Если есть замечания, прошу пищите. Возможно я использовал совершенно неправильный подход для решения данного вопроса. С интересом выслушаю ваши мысли.
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16

Re: Проблемма в создании навигации с помощью GUI

Сообщение zoon 25 фев 2011, 23:13

Nevers писал(а):Вот что получилось в итоге.

Если есть замечания, прошу пищите. Возможно я использовал совершенно неправильный подход для решения данного вопроса. С интересом выслушаю ваши мысли.


Честно говоря вы написали какой-то ужас :)
Если вы хотите что-то анимировать в Unity, проще всего воспользоваться
1) Корутинами (http://unity3d.com/support/documentatio ... Yield.html)
2) Встроенной системой анимации (http://unity3d.com/support/documentatio ... ation.html)

Вот примерно как выглядит FadeOut GUI на корутинах
Синтаксис:
Используется javascript
var alpha: float = 0;
var howLong: float = 5;

function Start()
{
    while (alpha <= 1)
    {
        alpha += (Time.deltaTime/howLong);
        yield WaitForEndOfFrame();
    }
}

function OnGUI () {
    // Save GUI color
    var c:Color = GUI.color;

    GUI.color = Color(c.r,c.g,c.b,Mathf.Clamp(alpha,0,1));
    GUI.Label (Rect (10, 10, 100, 40), "Hello World!");

    // Restore GUI color
    GUI.color = c;
}
 


Вы написали какой-то очень сложный автомат - так в принципе тоже можно, но можно написать сильно проще (раз в 6-7 :) ).
Джаггер
Evo
Аватара пользователя
zoon
UNIт
 
Сообщения: 58
Зарегистрирован: 24 май 2010, 08:27

Re: Проблемма в создании навигации с помощью GUI

Сообщение Woolf 26 фев 2011, 00:57

Nevers писал(а):Спасибо за ваши ответы. Теперь мне лучше понятна механика работы Гуя. Теперь назрели такие вопросы, на которые я пока не нашел ответа.

1. Как заставить ГУЙ отрисовывать элементы только при запуске функции пользователем, а не каждый фрейм.
2. По умолчанию ГУЙ удаляется все элементы перед каждой отработкой события onGui?


Ну вообще-то я работаю над таким гуем. У меня уже есть отрисовка окон, кнопок и текстлейбов по принципу "создал и забыл". Не знаю правда, насколько это нужно, ибо уже не первый год ходят слухи про новый гуй..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Проблемма в создании навигации с помощью GUI

Сообщение Nevers 28 фев 2011, 11:56

2zoon - Спасибо за ваш ответ.

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

Вот есть вопрос насчет анимации. Я почитал ман, но не смог найти как подключать созданную анимацию к GUI. Ведь GUI в процессе прорисовки ничего не создает...
Nevers
UNIт
 
Сообщения: 56
Зарегистрирован: 22 фев 2011, 10:16


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

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

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


cron