Подстраиваем GUI под разные разширения с помощью структуры M - Форум - Все для Unity3d

Все для Unity3d> Подстраиваем GUI под разные разширения с помощью структуры M - Форум>
Страница 1 из 11
Форум » Unity » Уроки » Подстраиваем GUI под разные разширения с помощью структуры M (В уроке познакомимся со структурой Matrixx4x)
Подстраиваем GUI под разные разширения с помощью структуры M
berilДата: Воскресенье, 20.07.2014, 03:20 | Сообщение # 1
Новый писатель
Группа: Пользователи
Сообщений: 31
Статус: Offline
Подстраиваем GUI под разные разширения с помощью структуры Matrix4x4


Видео вариант урока



Наверное у многих извас, кто пользуется стандартным GUI возникали проблемы при расположении элементов интерфейса,
так что бы при изменении расширения они оставались в  назначенном им месте. Выходом из этой
ситуации было вводить кучу вспомогательных переменных и с помощью них
отталкиваясь от Screen.width и Screen.height вычеслять место
положение. Но есть немного проще способ, это использование структуры Matrix4x4. Как вы уже
поняли это матрица с 4 строками и 4 стоблаци. Дальше мы и разберем небольшой
пример ее использования

Для начала зададим размер экрана 800х600.


Теперь создаем скрипт TestGUI. И в нем для примера создадим несколько кнопок вряд и
введем публичную переменную Position
для регулировки положения на экране


Код
using UnityEngine;
using System.Collections;
     
public class TestGUI : MonoBehaviour {
     
      publicfloat Position;
     
     
        voidStart () {
          
        }
     
     
      voidOnGUI()
      {
          for(int i = 0; i < 6; i++)
          {
             GUI.Button(new Rect(5 + (i * 80), Position, 80, 80), "Кнопка " +i.ToString());
          }
      }
     
     
}


Вешаем скрипт на
камеру. Переходим в режим 800х600 и запускаем игру. Регулируя переменную
настроим положение кнопок в левом нижнем углу. Окно Game разворачиваем на весь экран



Попробуемизменить разрешение на любое другое. Я к примеру установил 1680х1050 И что же
мы видим




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

Код
using UnityEngine;
using System.Collections;
       
public class TestGUI : MonoBehaviour {
       
       publicfloat Position;
       Vector2screen;
       
       
         voidStart () {
          screen.x = 1920;    
          screen.y = 1080;    
         }
       
       
       voidOnGUI()
       {
           for(int i = 0; i < 6; i++)
           {
              GUI.Button(new Rect(5 + (i * 80), Position, 80, 80), "Кнопка " +i.ToString());
           }
       }
       
       
}


Теперь создадим
метод где и будем изменять Matrix4x4


Код
void Resize()
       {
          Vector2 ratio = new Vector2(Screen.width / screen.x, Screen.height /screen.y);
          Matrix4x4 guiMatrix = Matrix4x4.identity;
          guiMatrix.SetTRS(new Vector3(1, 1, 1), Quaternion.identity, newVector3(ratio.x, ratio.y, 1));
           GUI.matrix = guiMatrix;
       }


Давайте
разберемся, что мы сделали. Первым делом мы создали переменную типа Vector2 и присвоили ей
значение. Вторая строчка мы создаем матрицу в 4 строки и в 4 столбца(Matrix4x4) и присваиваем
ей значение Matrix4x4.identity.
Matrix4x4.identity
это матрица у которой значения по диагонали равны 1


С помощью SetTRS задаем необходимое положение, размер.
Теперь перед созданием кнопок необходимо запустить наш
метод Resize() для перерасчета местоположения.
А после всех вычеслений присвоить Matrix4x4 значение identity.


Код
using UnityEngine;
using System.Collections;
       
public class TestGUI : MonoBehaviour {
       
       publicfloat Position;
       Vector2screen;
       
       
         voidStart () {
          screen.x = 1920;    
          screen.y = 1080;    
         }
       
       
       voidOnGUI()
       {
           Resize();
           for(int i = 0; i < 6; i++)
           {
              GUI.Button(new Rect(5 + (i * 80), Position, 80, 80), "Кнопка " +i.ToString());
           }
          GUI.matrix = Matrix4x4.identity;
       }
       
       voidResize()
       {
          Vector2 ratio = new Vector2(Screen.width / screen.x, Screen.height /screen.y);
          Matrix4x4 guiMatrix = Matrix4x4.identity;
          guiMatrix.SetTRS(new Vector3(1, 1, 1), Quaternion.identity, newVector3(ratio.x, ratio.y, 1));
           GUI.matrix = guiMatrix;
       }
}

Запускаем  игру и пробуем опятьрасположить наши кнопки в левом нижнем углу. После того, как расположили их,
меняеем расширение на другом и видим, что кнопки сохранили свое положение

Все очень просто и примитивно, но я надеюсь кто то этого не знал и урок будет полезным


Сообщение отредактировал beril - Воскресенье, 20.07.2014, 03:22
 
TemponaryДата: Воскресенье, 20.07.2014, 10:47 | Сообщение # 2
Новый писатель
Группа: Пользователи
Сообщений: 2
Статус: Offline
и что это?
Такое можно сделать и без матрицы. 
Screen.width/2, Screen.height/2 вот тебе!!
 
ArhAngel[RUS]Дата: Воскресенье, 20.07.2014, 11:17 | Сообщение # 3
Новый писатель
Группа: Пользователи
Сообщений: 9
Статус: Offline
Цитата Temponary ()
и что это?Такое можно сделать и без матрицы.
Screen.width/2, Screen.height/2 вот тебе!!

Поддерживаю. Лучше расскажите как такое же провернуть с NGUI


"Если хочешь сделать что-то хорошо — сделай это сам"©
===========================================
Work on the project "STK: Zone of Shadows"
=================================
 
berilДата: Воскресенье, 20.07.2014, 15:27 | Сообщение # 4
Новый писатель
Группа: Пользователи
Сообщений: 31
Статус: Offline
Цитата Temponary ()
Screen.width/2, Screen.height/2 вот тебе!!
Ну во -первых любые арифметические вычисления в OnGUI уменьшают производительность.
Во вторых, как видите  здесь не только подбирает само расширение экрана и подстраивает под него гуи, но и изменяет размер гуи (ширину и высоту) в зависимости от экрана
И в третьих Screen.width/2, Screen.height/2  это просто бред использовать это. Очень неудобно

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


Сообщение отредактировал beril - Воскресенье, 20.07.2014, 15:29
 
maxim738Дата: Воскресенье, 20.07.2014, 16:12 | Сообщение # 5
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Очень занимательно , хороший урок , жаль что GUI в юнити такая ущербная . Ув.beril , можете ли вы сделать урок по NUI или IGUI где подробно рассказано о связи C# и NGUI  , а то не знаю ни одной команды о правке той же NGUi , например как сделать тот же способ подстараивания элементов под экран  ,как  когда надо включать кнопку или отключать и как вообще получить доступ из одного скрипта ко всем элементам NGUI или какому нибудь в отдельности?

Скрипты на заказ, помощь в исправлении ошибок ,работа с чужим кодом.В лс,недорого.
 
berilДата: Понедельник, 21.07.2014, 16:27 | Сообщение # 6
Новый писатель
Группа: Пользователи
Сообщений: 31
Статус: Offline
Цитата maxim738 ()
Очень занимательно , хороший урок , жаль что GUI в юнити такая ущербная . Ув.beril , можете ли вы сделать урок по NUI или IGUI где подробно рассказано о связи C# и NGUI , а то не знаю ни одной команды о правке той же NGUi , например как сделать тот же способ подстараивания элементов под экран ,как когда надо включать кнопку или отключать и как вообще получить доступ из одного скрипта ко всем элементам NGUI или какому нибудь в отдельности?
Увы с NGUI  практически не знаком. Пользуюсь самодельными решениями. Но то что видел, там хорошая документация по API + хорошие видео уроки. Ну и скоро у Юнити будет новый гуи )
 
Форум » Unity » Уроки » Подстраиваем GUI под разные разширения с помощью структуры M (В уроке познакомимся со структурой Matrixx4x)
Страница 1 из 11
Поиск:
Свернуть
Развернуть
Необходима авторизация
0
ТОП-5 САЙТА
НОВЫЕ ИГРЫ
ГОРЯЧИЕ ТЕМЫ
СЛУЧАЙНЫЕ ФАЙЛЫ