Универсальный контроллер GUI интерфейса. (Js)

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

Универсальный контроллер GUI интерфейса. (Js)

Сообщение Левш@ 19 июн 2011, 10:54

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

Синтаксис:
Используется javascript
var posX = 0.0;
var posY = 0.0;
var shirina = 0.0;
var vysota = 0.0;
var scrinWidth = 0.0;
var scrinHeight = 0.0;
var scrinBalansWidth = 0.0;
var scrinBalansHeight = 0.0;

function Start ()  {
        posX = guiTexture.pixelInset.x;
        posY = guiTexture.pixelInset.y;
        shirina = guiTexture.pixelInset.width;
        vysota = guiTexture.pixelInset.height;
            scrinWidth = Screen.width;
        scrinHeight = Screen.height;
        scrinBalansWidth = 1452 / scrinWidth;
        scrinBalansHeight = 910 / scrinHeight;
        Balans ();
}

function Balans () {
        guiTexture.pixelInset.x = posX / scrinBalansWidth;
        guiTexture.pixelInset.y = posY / scrinBalansHeight;
        guiTexture.pixelInset.width = shirina / scrinBalansWidth;
        guiTexture.pixelInset.height = vysota / scrinBalansHeight;
}


Обьясняю суть кода:
Обычно все работают в редакторе в режиме FreeAspect (но это не важно, применимо под любое разрешение), устанавливаете все параметры размеров и позиций обьектов GUI как обычно в инспекторе, в свойствах.
Затем вешаете данный скрипт на каждый GUI обьект интерфейса. (ВАЖНО! - в делители переменных scrinBalansWidth и scrinBalansHeight пропишите реальные значения разрешения в котором настраивался GUI).
Дальше скрипт будет сам устанавливать все позиции и размеры относительно ScrinResolution, четко сохраняя все обьекты на своих местах в любой точке экрана.
Скрипт сначала записывает в свои переменные ваши настройки, затем пересчитывает все под текущее разрешение экрана и возвращает назад уже уточненые, сохраняя все соотношения и применяя новые размеры и позиции обьектов. :)

640 х 480
Изображение

1920 х 1080
Изображение

Вот, добавил для GUIText:

Синтаксис:
Используется javascript
private var pos_X = 0.0;
private var pos_Y = 0.0;
private var textSize = 0;
private var scrinWidth = 0.0;
private var scrinHeight = 0.0;
private var BalansWidth = 0.0;
private var BalansHeight = 0.0;

function Start ()  {
                pos_X = guiText.pixelOffset.x;
                pos_Y = guiText.pixelOffset.y;
                textSize = guiText.fontSize;
                scrinWidth = Screen.width;
                scrinHeight = Screen.height;
                BalansWidth = 800 / scrinWidth;
                BalansHeight = 600 / scrinHeight;
                guiText.pixelOffset.x = pos_X / BalansWidth;
                guiText.pixelOffset.y = pos_Y / BalansHeight;
                guiText.fontSize = textSize / BalansHeight;
}
Последний раз редактировалось Левш@ 11 май 2015, 16:45, всего редактировалось 4 раз(а).
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Deatrocker 27 сен 2011, 20:24

Спасибо!!! это хорошее решение, да вот только есть еще один косяк =) интерфейс как его ненастраивай уходит гулять при реальном запуске =) Но это просто уже тонкости настройки =) Кстати разве нельзя сделать внутри игровое меню с настройками разрешения, и например по нажатию на другое разрешение происходит пересчет? =)
Tauren chieftain
Аватара пользователя
Deatrocker
UNITрон
 
Сообщения: 186
Зарегистрирован: 07 июл 2011, 00:04
Откуда: Ростов-на-Дону
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Левш@ 16 дек 2011, 16:12

Кстати разве нельзя сделать внутри игровое меню с настройками разрешения, и например по нажатию на другое разрешение происходит пересчет? =)

Можно, тот же участок кода перевести в Update.
Или так, контролировать изменения и пересчитывать:

Синтаксис:
Используется javascript
function OnGUI ()  {
        if (scrinWidth != Screen.width || scrinHeight != Screen.height)
                GuiCorector ();
}
function GuiCorector ()  {
                pos_X = guiText.pixelOffset.x;
                pos_Y = guiText.pixelOffset.y;
                textSize = guiText.fontSize;
                BalansWidth = scrinWidth / Screen.width;
                BalansHeight = scrinHeight / Screen.height;
                guiText.pixelOffset.x = pos_X / BalansWidth;
                guiText.pixelOffset.y = pos_Y / BalansHeight;
                guiText.fontSize = textSize / BalansHeight;
                scrinWidth = Screen.width;
                scrinHeight = Screen.height;
}


Кстати, добавил в шапку код для GUIText.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение narutokaubi98 01 апр 2012, 19:38

помогите плз,неполучается...скайп Dem0ndevil
narutokaubi98
UNец
 
Сообщения: 6
Зарегистрирован: 22 мар 2012, 10:20

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Левш@ 04 апр 2012, 18:10

Что именно не получаеться?

интерфейс как его ненастраивай уходит гулять при реальном запуске =)

Посмотрите на скрины вверху темы, где он гуляет? Абсолютно все на местах, пиксель в пиксель... :-?
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение narutokaubi98 07 май 2012, 19:30

у меня она просто меньше стоновитя задоного
narutokaubi98
UNец
 
Сообщения: 6
Зарегистрирован: 22 мар 2012, 10:20

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение faceOFF 09 июн 2012, 08:47

Автору СПАСИБО большое!!!

интерфейс как его ненастраивай уходит гулять при реальном запуске =)

у меня она просто меньше стоновитя задоного


Тоже не сразу вкурил, тк сначала пытался выставлять разрешение в var scrinBalansWidth = 0.0; var scrinBalansHeight = 0.0;
Его нужно менять в:
function Start () {
posX = guiTexture.pixelInset.x;
posY = guiTexture.pixelInset.y;
shirina = guiTexture.pixelInset.width;
vysota = guiTexture.pixelInset.height;
scrinWidth = Screen.width;
scrinHeight = Screen.height;
scrinBalansWidth = 1452 / scrinWidth;
scrinBalansHeight = 910 / scrinHeight;
Balans ();
}


В итоге Если у меня в окне Game выставленно NexusOne Tall (480x800) то у меня получается:
Синтаксис:
Используется javascript
function Start ()  {
        posX = guiTexture.pixelInset.x;
        posY = guiTexture.pixelInset.y;
        shirina = guiTexture.pixelInset.width;
        vysota = guiTexture.pixelInset.height;
        scrinWidth = Screen.width;
        scrinHeight = Screen.height;
        scrinBalansWidth = 480 / scrinWidth;
        scrinBalansHeight = 800 / scrinHeight;
        Balans ();
}

Всё работает как часы!!!
Ещё раз спасибо!!!
Аватара пользователя
faceOFF
UNец
 
Сообщения: 30
Зарегистрирован: 26 апр 2012, 06:43

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение faceOFF 14 июн 2012, 14:15

GUILayout.Label возможно заресайзить подобным образом?
Аватара пользователя
faceOFF
UNец
 
Сообщения: 30
Зарегистрирован: 26 апр 2012, 06:43

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение pod4444 14 июн 2012, 14:48

faceOFF писал(а):GUILayout.Label возможно заресайзить подобным образом?

можно
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Левш@ 29 июл 2012, 19:07

Тоже не сразу вкурил, тк сначала пытался выставлять разрешение в var scrinBalansWidth = 0.0; var scrinBalansHeight = 0.0;

Ну так писалось же:
(ВАЖНО! - в делители переменных scrinBalansWidth и scrinBalansHeight пропишите реальные значения разрешения в котором настраивался GUI).


И еще если нужно сохранять форму квадратных или круглых обьктов, то вводиться тег "QwadGui",присваиваеться квадратным (или круглым) обьектам и тогда делаем так:
Синтаксис:
Используется javascript
if (guiTexture.gameObject.tag == "QwadGui") {
        guiTexture.pixelInset.x += (guiTexture.pixelInset.width - guiTexture.pixelInset.height) / 2;
        guiTexture.pixelInset.width = guiTexture.pixelInset.height;
}
 


Полный код:
Синтаксис:
Используется javascript
private var posX = 0.0;
private var posY = 0.0;
private var shirina = 0.0;
private var vysota = 0.0;
private var scrinWidth = 0.0;
private var scrinHeight = 0.0;
private var BalansWidth = 0.0;
private var BalansHeight = 0.0;

function Start () {
                posX = guiTexture.pixelInset.x;
                posY = guiTexture.pixelInset.y;
                shirina = guiTexture.pixelInset.width;
                vysota = guiTexture.pixelInset.height;
                scrinWidth = Screen.width;
                scrinHeight = Screen.height;
                BalansWidth = 800 / scrinWidth;
                BalansHeight = 600 / scrinHeight;
                guiTexture.pixelInset.x = posX / BalansWidth;
                guiTexture.pixelInset.y = posY / BalansHeight;
                guiTexture.pixelInset.width = shirina / BalansWidth;
                guiTexture.pixelInset.height = vysota / BalansHeight;
                Interface.orderInterface = 1;
                GuiCorector();
}
function OnGUI ()  {
        if (scrinWidth != Screen.width || scrinHeight != Screen.height)
                GuiCorector ();
}
function GuiCorector ()  {
                posX = guiTexture.pixelInset.x;
                posY = guiTexture.pixelInset.y;
                shirina = guiTexture.pixelInset.width;
                vysota = guiTexture.pixelInset.height;
                BalansWidth = scrinWidth / Screen.width;
                BalansHeight = scrinHeight / Screen.height;
                guiTexture.pixelInset.x = posX / BalansWidth;
                guiTexture.pixelInset.y = posY / BalansHeight;
                guiTexture.pixelInset.width = shirina / BalansWidth;
                guiTexture.pixelInset.height = vysota / BalansHeight;
                scrinWidth = Screen.width;
                scrinHeight = Screen.height;
        if (guiTexture.gameObject.tag == "QwadGui") {
                guiTexture.pixelInset.x += (guiTexture.pixelInset.width - guiTexture.pixelInset.height) / 2;
                guiTexture.pixelInset.width = guiTexture.pixelInset.height;
        }
        if (guiTexture.gameObject.tag == "RadarGui")
                guiTexture.pixelInset.width = guiTexture.pixelInset.height;
}
 
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Ingener 24 сен 2012, 15:59

Можно ли какую-нибудь показательную демку?
Ingener
UNIт
 
Сообщения: 53
Зарегистрирован: 06 мар 2012, 14:50

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Левш@ 29 сен 2012, 11:38

показательную демку?

Вообщето даренному коню в зубы не смотрят. ;)
Ну да ладно, сбилдю что нибудь потом...
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение anti0 20 авг 2013, 20:16

Скажите пожалуйста этот скрипт нужно кидать на сам guitexture?Если так то как было написано narutokaubi98 - объект только становится меньше.
Пожалуйста, проголосуйте за мою игру в steam :)
anti0
UNIт
 
Сообщения: 60
Зарегистрирован: 25 мар 2012, 17:20

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение Левш@ 21 авг 2013, 17:32

скрипт нужно кидать на сам guitexture

да.

как было написано narutokaubi98 - объект только становится меньше

В кривых руках - возможно...
В шапке темы есть скрины и разрешения из которых снимались указаны.

Причина судя по всему в невнимательности:
ВАЖНО! - в делители переменных scrinBalansWidth и scrinBalansHeight пропишите реальные значения разрешения в котором настраивался GUI
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Универсальный контроллер GUI интерфейса. (Js)

Сообщение lonleystranger 26 янв 2014, 20:54

Хотел спросить, а этот скрипт выгоднее, чем считать каждую координату в процентном отношении к экрану? Ведь если считать координаты в процентном отношении, то не только объекты будут на своих местах, а и размер объектов будет соответсвующий, и на высоком разрешении меню не будут выглядеть миниатюрными... Да и делается процентное отношение проще. Просто хочу спросить мнение старожилов форума...
lonleystranger
UNIт
 
Сообщения: 96
Зарегистрирован: 25 сен 2013, 08:25

След.

Вернуться в Исходники (Копилка)

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

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