Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > 2D/GUI

2D/GUI Вопросы на тему 2D графики и интерфейсов

Ответ
 
Опции темы
Старый 18.01.2016, 13:46   #1
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,442
Написано 5,269 полезных сообщений
(для 15,227 пользователей)
Проделки размера GUI

Сделал GUI а Canvas.
У последнего выставлено
UI Scale Mode: Scale With Screen Size

На нём расположено некоторое количество элементов (пара кнопок, тексты, картинка).

Но у меня также есть префабы кнопок, из которых я создаю GameObject'ы вот так:

GameObject levelButton = (GameObject)Instantiate(Resources.Load("путь-к-префабу"typeof(GameObject)));
levelButton.transform.SetParent(canvas.transform); 
В Play Mode всё ок.

Те элементы, которые я разместил в редакторе — с ними нормально всё.
Когда компилю и запускаю на мобилке, кодом созданныя кнопки становятся меньше чем надо, раза в три.

Конечно, это связано с тем, что у меня окошко Game маленькое, а телефон FullHD.
Но, блин, какого хрена не срабатывает UI Scale Mode: Scale With Screen Size у канваса? И почему если я на нём в редакторе размещу элементы GUI, то они норм скейлятся? А вручную заинстансенные ведут себя вот так?

Как с этим бороться? Можно, конечно, при инстансинге сразу же выставлять Scale, но что-то мне кажется, что есть штатное решение, или я что-то делаю не так.

Количество и расположение кнопок зависит от происходящего в игре, поэтому я не могу разместить их все заранее.
Гуглить это сложно по той причине, что новый GUI появился в Юнити сравнительно недавно, и теперь в результатах поиска неразбериха, постоянно попадаю на инфу о Legacy GUI.

Ответ дан в посте №3
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена


Последний раз редактировалось ABTOMAT, 19.01.2016 в 17:50.
(Offline)
 
Ответить с цитированием
Старый 18.01.2016, 15:10   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Проделки размера GUI

Сообщение от ABTOMAT Посмотреть сообщение
Сделал GUI а Canvas.
У последнего выставлено
UI Scale Mode: Scale With Screen Size

На нём расположено некоторое количество элементов (пара кнопок, тексты, картинка).

Но у меня также есть префабы кнопок, из которых я создаю GameObject'ы вот так:

GameObject levelButton = (GameObject)Instantiate(Resources.Load("путь-к-префабу"typeof(GameObject)));
levelButton.transform.SetParent(canvas.transform); 
В Play Mode всё ок.

Те элементы, которые я разместил в редакторе — с ними нормально всё.
Когда компилю и запускаю на мобилке, кодом созданныя кнопки становятся меньше чем надо, раза в три.

Конечно, это связано с тем, что у меня окошко Game маленькое, а телефон FullHD.
Но, блин, какого хрена не срабатывает UI Scale Mode: Scale With Screen Size у канваса? И почему если я на нём в редакторе размещу элементы GUI, то они норм скейлятся? А вручную заинстансенные ведут себя вот так?

Как с этим бороться? Можно, конечно, при инстансинге сразу же выставлять Scale, но что-то мне кажется, что есть штатное решение, или я что-то делаю не так.

Количество и расположение кнопок зависит от происходящего в игре, поэтому я не могу разместить их все заранее.
Гуглить это сложно по той причине, что новый GUI появился в Юнити сравнительно недавно, и теперь в результатах поиска неразбериха, постоянно попадаю на инфу о Legacy GUI.
Если скеил изменился когда-то, и ты делаешь инстанс, то вроде это никак стандартно не решается, потому что по идее вызывать алгоритм перестройки UI нужно лишь раз - при смене размера экрана. Я бы поискал функции типо rebuild UI (я хз, есть ли такая), которую нужно вызывать после каждого инстанса, что бы пересчитал размеры всех потомков.

UPD:
http://docs.unity3d.com/ScriptRefere...vasScaler.html

Попробуй вызывать Update или:
var scale = canvasScaler.scaleFactor;
canvasScaler.setScaleFactor(0.1023);
canvasScaler.setScaleFactor(scale);
это принудительно обновит канвас. Если не помогает - вручную ставит скеил
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ABTOMAT (18.01.2016)
Старый 19.01.2016, 07:36   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Проделки размера GUI

Я бы попробовал просто добавить параметр worldPositionStays = false функции SetParent:

levelButton.transform.SetParent(canvas.transformfalse); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ABTOMAT (19.01.2016)
Старый 19.01.2016, 07:59   #4
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Проделки размера GUI

Сообщение от pax Посмотреть сообщение
Я бы попробовал просто добавить параметр worldPositionStays = false функции SetParent:

levelButton.transform.SetParent(canvas.transformfalse); 
По умолчанию вроде false всегда, потому что если true - то объект существует независимо от движения объекта-родителя. Удобно для поиска объектов внутри перента без привязки к координатной системе онного.
Я не думаю, что для UI наоборот все.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 19.01.2016, 08:11   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Проделки размера GUI

По умолчанию true

UPD: Это разовая функция, т.е. влияет только в момент смены родителя. Если хочется оставить объект на месте в момент привязки к паренту то true, если хочется оставить неизменными локальные координаты - false. В данном случае - не наследовать масштаб родителя - GUI.
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 19.01.2016 в 10:03.
(Offline)
 
Ответить с цитированием
Старый 19.01.2016, 17:49   #6
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,442
Написано 5,269 полезных сообщений
(для 15,227 пользователей)
Ответ: Проделки размера GUI

Сообщение от pax Посмотреть сообщение
Я бы попробовал просто добавить параметр worldPositionStays = false функции SetParent:

levelButton.transform.SetParent(canvas.transformfalse); 
Именно это и дало нужный результат! Спасибо!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 23:30.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com