forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D/GUI (http://forum.boolean.name/forumdisplay.php?f=167)
-   -   Проделки размера GUI (http://forum.boolean.name/showthread.php?t=20156)

ABTOMAT 18.01.2016 16:46

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

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

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

PHP код:

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

RegIon 18.01.2016 18:10

Ответ: Проделки размера GUI
 
Цитата:

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

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

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

PHP код:

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);

это принудительно обновит канвас. Если не помогает - вручную ставит скеил

pax 19.01.2016 10:36

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

PHP код:

levelButton.transform.SetParent(canvas.transformfalse); 


RegIon 19.01.2016 10:59

Ответ: Проделки размера GUI
 
Цитата:

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

PHP код:

levelButton.transform.SetParent(canvas.transformfalse); 


По умолчанию вроде false всегда, потому что если true - то объект существует независимо от движения объекта-родителя. Удобно для поиска объектов внутри перента без привязки к координатной системе онного.
Я не думаю, что для UI наоборот все.

pax 19.01.2016 11:11

Ответ: Проделки размера GUI
 
По умолчанию true

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

ABTOMAT 19.01.2016 20:49

Ответ: Проделки размера GUI
 
Цитата:

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

PHP код:

levelButton.transform.SetParent(canvas.transformfalse); 


Именно это и дало нужный результат! Спасибо!


Часовой пояс GMT +4, время: 01:01.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot