Показать сообщение отдельно
Старый 18.01.2016, 18: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)