|
2D/GUI Вопросы на тему 2D графики и интерфейсов |
18.01.2016, 16:46
|
#1
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Проделки размера 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 в 20:50.
|
(Offline)
|
|
18.01.2016, 18:10
|
#2
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 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);
это принудительно обновит канвас. Если не помогает - вручную ставит скеил
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.01.2016, 10:36
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проделки размера GUI
Я бы попробовал просто добавить параметр worldPositionStays = false функции SetParent:
levelButton.transform.SetParent(canvas.transform, false);
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.01.2016, 10:59
|
#4
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проделки размера GUI
Сообщение от pax
Я бы попробовал просто добавить параметр worldPositionStays = false функции SetParent:
levelButton.transform.SetParent(canvas.transform, false);
|
По умолчанию вроде false всегда, потому что если true - то объект существует независимо от движения объекта-родителя. Удобно для поиска объектов внутри перента без привязки к координатной системе онного.
Я не думаю, что для UI наоборот все.
|
(Offline)
|
|
19.01.2016, 11:11
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проделки размера GUI
По умолчанию true
UPD: Это разовая функция, т.е. влияет только в момент смены родителя. Если хочется оставить объект на месте в момент привязки к паренту то true, если хочется оставить неизменными локальные координаты - false. В данном случае - не наследовать масштаб родителя - GUI.
Последний раз редактировалось pax, 19.01.2016 в 13:03.
|
(Offline)
|
|
19.01.2016, 20:49
|
#6
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Проделки размера GUI
Сообщение от pax
Я бы попробовал просто добавить параметр worldPositionStays = false функции SetParent:
levelButton.transform.SetParent(canvas.transform, false);
|
Именно это и дало нужный результат! Спасибо!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:31.
|