Unity 4.6 - Как масштабировать элементы GUI до нужного размера для каждого разрешения
Новый Unity 4.6 поставляется с новым графическим интерфейсом. Когда я меняю разрешение в Unity, кнопка пользовательского интерфейса отлично масштабируется, но когда я тестирую на устройстве Nexus 7, кнопка выглядит слишком маленькой. Есть идеи, как это решить?
5 ответов
Новая система графического интерфейса Unity использует "якоря" для управления тем, как элементы графического интерфейса (например, кнопки) масштабируются относительно их родительского контейнера.
В Unity есть обучающее видео о том, как использовать новый компонент "Rect Transform" (где настроены якоря), здесь: http://unity3d.com/learn/tutorials/modules/beginner/ui/rect-transform.
Последняя половина урока посвящена якорям. На этой странице есть ссылки на всю серию уроков. Это не слишком долго. Вы должны смотреть все это.
Специфично для вашего вопроса:
Якоря видны на вашем первом снимке экрана. Это те 4 маленькие стрелки в левом верхнем углу вашей кнопки.
Прямо сейчас ваша кнопка привязана только к верхнему левому углу.
Два правых якоря нужно перетащить вправо, чтобы правый край вашей кнопки закрепился в пространстве внутри родительского контейнера.
В зависимости от вашей ситуации две нижние стрелки могут понадобиться перетащить вниз, чтобы нижний край кнопки также был закреплен.
Видео, которое я привел выше, подробно описывает все это.
Наконец, для того, чтобы размер шрифта хорошо масштабировался при разных разрешениях, вам нужно будет добавить и настроить компонент эталонного разрешения для базового холста вашего пользовательского интерфейса, как ранее писал Ash-Bash32.
Обновление. Лучший способ добавить компонент "Разрешение ссылок" - через окно инспектора для базового холста в вашем пользовательском интерфейсе.
1) нажмите кнопку "Добавить компонент" внизу инспектора.
2) введите слово "Ссылка" в поле фильтра поиска.
3) выберите компонент "Разрешение ссылок" в результатах поиска.
Эталонное разрешение теперь переименовывается в Canvas Scaler. Наряду с переименованием они добавили еще много функций для динамичности Canvas. Вы можете просмотреть документ Unity Doc от Canvas Scaler, а также взглянуть на эту статью, чтобы найти практический пример того, как и зачем использовать Canvas Scaler. Также убедитесь, что вы используете точки привязки, чтобы сделать это более надежным...
В Scale UI добавлен компонент ReferenceResolution к Canvas, который вы хотите масштабировать.
PS Theres нет документации для ReferenceResolution
Если вы хотите, чтобы кнопка была одинакового размера для всех экранов и разрешений, вам нужно добавить компонент Canvas Scaler к холсту и установить режим соответствия экрана: соответствовать ширине или высоте, вот ссылка на документы, это очень помогает, если вы хотите стремиться к разным размерам или разрешениям:
Это становится гигантским и запутанным, когда вы начнете раскладывать вещи в коде И использовать скалярный скейлер, поэтому я хочу дать исчерпывающий ответ, чтобы сэкономить кому-то часы, которые я провел.
Во-первых, не используйте anchoredPosition, чтобы позиционировать что-либо, если только вы полностью не понимаете, что это число от 0,0 до 1,0. Используйте RectTransform localPosition, чтобы сделать фактическое расположение, и помните, что это связано с родительским якорем. (Пришлось выложить сетку из центра)
Во-вторых, поместите скейлер Canvas на родительский объект макета И на внутренние части пользовательского интерфейса. Один делает макет в правильном положении, другой изменяет размеры ваших элементов, чтобы они действительно отображались правильно. Вы не можете полагаться на родителя, если у детей также нет скейлеров (и графических Raycasters, чтобы коснуться их).
В-третьих, если у вас есть инструмент для масштабирования, НЕ используйте Screen.width и height, вместо этого предположите, что экран является тем же значением, которое вы указали для инструментов масштабирования (надеюсь, вы использовали то же самое или знаете, что делаете). Ширина экрана всегда возвращает фактические пиксели устройства, устройства Retina тоже, но скейлеры Canvas НЕ учитывают это. Это, вероятно, дает единице единственный оставшийся способ найти фактическое разрешение экрана, если ваша игра этого хочет. Редактировать: этот абзац применяется к любому родительскому холсту, связанному с кодом, выполняющим макет. Не бродячие полотна, вы, вероятно, можете смешать это. Просто помните руководящие принципы единства по работе с холстами.
В-четвертых, холст все еще немного глючит. Даже если все вышеперечисленное работает, некоторые вещи не отображаются, пока вы не удалите и не воссоздаете холст, если вы заново открываете сцену или она падает. В остальном, это общие "правила", которые я нашел.
Чтобы центрировать "сетку вещей", вы не можете просто использовать половину ширины или высоты скейлера холста, вам нужно вычислить высоту вашей сетки и установить смещение на половину ее, иначе она всегда будет немного смещена. Я просто добавил это как дополнительный совет. Этот расчет работает для всех направлений.