Настройка GUI элементов

Доброго времени суток, сегодня я буду говорить о 2D текстурах которые находятся у нас на экране игры которую мы делаем. Это различные прицелы, менюшки и тп. К примеру на изображении ниже вы можете видеть прицел посреди экрана, выделил я его красным кружком.

Прицел на экране Unity 3d
Dante

 

Теперь давайте рассмотрим код который отвечает за отображение нашего прицела.

Пример кода вывода прицела
Dante

 

Как можете видеть прицел находится посреди экрана, давайте теперь немного поиграемся с настройками отображения нашего прицела. Это только в качестве примера.

 

GUI.Box(new Rect(Screen.width/2-10,Screen.height/2,20,20),»»,targetStyle);

 

А вот здесь давайте проведем эксперимент, и строку высота экрана Screen.height деленную на 2, запишем несколько иначе. Разделим на 200 и умножим на 100, кажется относительно математики все должно быть точно так же, изменим код строки на вот такой:

 

GUI.Box(new Rect(Screen.width/2-10,Screen.height/200*100,20,20),»»,targetStyle);

 

Сохраняем код и смотрим на то что получилось. ??? А получилось что-то не то. Собственно прицел находится гораздо выше центра нашего экрана. Ну у меня как на изображении ниже.

Пример прицела выше середины экрана
Dante

 

Сразу встаёт вопрос. А чего так? Ведь код должен быть одинаковым. Ага должен быть, но это просто совсем не одно и тоже. Давайте добавим в код вот такую строку

 

Debug.Log(Screen.height/200*100+ » «+Screen.height*100/200+» «+Screen.height);

 

Выглядеть код стал вот так:

Выводим код ширины экрана в консоль
Dante

 

Итак что же я дописал? Debug.Log выводит в консоль, дальше в скобках идет то что мы непосредственно выводим в консоль. Сначала высота экрана Screen.height деленная на 200 и умноженная на 100, затем, высота экрана Screen.height умноженная на 100 и деленная на 200 хоть и казалось что это одно и тоже, но это не так, и затем просто выводим высоту экрана. Это я написал для того чтобы просто понять как эти размеры измеряются, и где проблема, давайте теперь запустим игру и посмотрим что говорит консоль. А она говорит.

Вывод консоли о ширине экрана
Dante

 

Как мы можем видеть, если сначала мы делим на 200 и затем умножаем на 100 то получаем 200. Затем если мы сначала умножаем на 100, а затем делим на 200, то получаем 298. А общая ширина экрана равна 597. Думаю всем понятно что здесь второй ответ правильный, соответственно и решение второе правильное, а что же с первым не так? Подумаем, и несколько упростим заданное решение и просто высоту экрана разделим на 200, без деления на сто, короче просто меняем строку на такой вид.

 

Debug.Log(Screen.height/200+ » «+Screen.height*100/200+» «+Screen.height);

 

Обратно запускаем игру и смотрим что говорит консоль о первом решении, а она говорит что высота экрана, а это мы как можем видеть 597, деленая на 200 равна 2. Правда занятно. В чем здесь проблема, ну в принципе, должно получится 2.98, но проблема в том что Unity3D отбрасывает цифры после точки, то есть считает что это int. Теперь давайте попробуем объявить Unity о том что эта переменная float. Обратно изменяем строку Debug.Log, и она принимает вот такой вид:

 

Debug.Log((float)Screen.height/200+ » «+Screen.height*100/200+» «+Screen.height);

 

Снова сохраняем скрипт и запускаем игру и смотрим вывод консоли. Вот что мы теперь видим? А теперь мы видим что высота экрана делённая на 200 равна 2.985. Что собственно и является правильным. Поэтому можно конечно указывать Unity что переменная float, но в принципе проще просто сначала умножать а затем делить, для того чтобы Unity не удалял цифры которые остаются после точки. Поэтому лучше писать Screen.height*100/200. В этом случае даже если что-либо округлится, то там не должно быть такой большой погрешности как в первом случае. Хочется верить что, то что я описал понял не только я.

 

До новых статей. Надеюсь заданный пример был понятен.

Настройка GUI элементов: 2 комментария

  1. При работе с графическим элементом, Вы можете создать для него составное изображение, включающее основное изображение и иконку, размещенную поверх него. Такая организация позволяет быстро и просто создавать однотипные элементы управления.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *