как узнать размер экрана unity
Как узнать размер экрана unity
Размер экрана устройства
priestevi | Дата: Четверг, 13 Апреля 2017, 12:40 | Сообщение # 1 | |
всем привет, столкнулся с такой вот штукой, экраны ты разные у телефонов\планшетов поэтому и камера в 2д игре отображает по разному все, собственно теперь вопрос: у меня по внешним краям стоят игровые объекты призванные ограничить вылет npc за границы экрана, я решил каждый раз при старте сцены их выставлять скриптом ровно за границей экрана что бы казалось что объект отскакивает от краёв экрана, но почему то скрипт слишком далеко закидывает эти самые объекты хотя вроде в скрипте то я правильно рассуждаю насчет расчета положения объектов using System.Collections; public class Walls : MonoBehaviour < public Camera cam; void Start () может есть у кого мысли какие? | ||
EchoIT | Дата: Четверг, 13 Апреля 2017, 13:45 | Сообщение # 2 | |
priestevi, вы сравниваете размеры экрана с игровыми единицами измерения, т.е. пиксель приравниваете к игровому метру. Понятное дело, что так выходит неправильно. Попробуйте заменить присвоение ширины и высоты экрана на это. Сам не проверял, просто первое, что в голову пришло. | кажется тут надо использовать ScreenToWorldPoint, как раз в описании сказано что это трансформ позиции точки на экране в мировые координаты using System.Collections; public class Walls : MonoBehaviour < public Camera cam; теперь ограничивающие гейм обджекты подстраиваются точнехонько под размеры экрана Маштабирование сцены под разные экраны Unity3DРебят, я не могу понять, как правильно организовать маштабирование сцены в Unity3D под все экраны? Уже облазил весь гугл, но так и не нашел конкретного решения этой проблемы. KumoKairo, допустим у меня есть сцена, где камера будет неподвижна, и мне нужно видеть определенный геймплей в этой камере. И чтобы этот геймплей умещался на всех экранах. Также имеется фон, который как я понял, будет обрезаться, если ширина экрана становится меньше, чем ширина фона. Тоесть делаем под самый более менее квадратный экран, и следовательно на всех более широких экранах будет по любому все что нужно видно. Вы это имели ввиду? А что, если нужно персонажа четко в левой стороне экрана устанавливать? Или какое-нибудь GUI, которое отображается по краям вверху? Если мы все это расставим для экрана 4 к 3, то при более широком экране, все эти элементы(GUI, персонаж) будут уже не у краев. По поводу GUI это отдельная история, посмотри хотя бы туториалы на сайте юнити. Всё гораздо проще, чем ты думаешь Ну хорошо, с GUI опустим. А что по поводу персонажа, который должен в правой стороне экрана стоять?:) Там и якоря и масштабы, различные варианты. Выбираешь что тебе удобнее в данном конкретном случае. По поводу персонажа, я так понимаю он не спрайт, который можно так же как элемент GUI вывести, можно тоже несколькими способами выводить. Можешь тупо математикой вычислить, а можешь из координат гуя перевести в мировые и выводить в этом месте всё что пожелаешь Да, и еще хотел спросить несколько вопросов по поводу спрайтов для мобильных платформ: Не очень хотелось бы начинать игру и столкнуться со всеми этими проблемами, и после этого переделывать весь проект. Лучше заранее узнать все что нужно в данной области( разработка игр под мобильные платформы ), и потом уже делать более менее правильно. Есть старое видео по поводу скейлинга bretbas Да, совсем без обрезки не обойтись, тут зависит от конкретного примера и конкретных требований Копаться в тонкостях проще и приятней всего, можно без зазрения совести распыляться до бесконечности и при этом иметь какой-то быстрый результат на руках. Я сам этим постоянно занимаюсь и постоянно стараюсь с этим бороться. Но если идея именно в этом, без какого-то конкретного проекта, то всё круто) С идеи в тонкостях копаться тоже приятно. Только долго, ибо заморачиваешься над всякой фигней. Хотя в некоторых случаях это не фигня. Вот к примеру, задавал на офф форуме Unity3d, почему поиск/сравнение и тд тегов у игровых объектов идет через string. Это же ужасно в плане производительности. Так и не дождался ответа. Как получить размер панели в пикселях?Помощь в написании контрольных, курсовых и дипломных работ здесь. Как узнать ширину текста в пикселях на определённой панели в StatusBar Как узнать размер строки в пикселях? Как зафиксировать размер изображения в пикселях (Решено) Как я могу узнать размер экрана в пикселях? РешениеДобавлено через 59 секунд и содержит дополнительные данные (например, якоря) для размещения UI-объекта в координатах Canvas (пикселях), которое работает по иным законам, чем игровые объекты, которые находятся в игровых координатах (юнитах). В то же время любой UI-элемент находится также и в игровых координатах, которые можно получить через тот же transform, как и через RectTransform тоже, поскольку последний наследует все свойства первого. [!] Но манипулировать расположением объекта в UI все же нужно через RectTransform, т.к. находясь в Canvas он будет размещаться именно по правилам RectTransform. Оба вариант дадут один и тот же объект RectTransform, только второй вариант будет чуточку быстрее (разницу в скорости можно ощутить, например, если вы это делаете для тысяч объектов в каждом кадре, но в этом случае лучше будет сделать это 1 раз, например в Awake и сохранить в приватную переменную класса компонента). Backkk, вряд ли ощутите экономию на таком кол-ве даже на очень долхом компе. Эти небольшие колебания fps могут быть вызваны другими причинами. Только если проект сильно разрастется и вы везде и всюду будете использовать GetComponent (вместо того, чтобы один раз его вызвать при старте объекта или еще лучше сделать поле [SerializeField] и назначить его редакторе). К тому же чаще всего у вас не будет под рукой объекта, который можно будет привести к нужному типу, как в случае с transform, а будут доступны только варианты с GetComponent, либо сериализуемое поле. Разрешение для фонов игр и всего 2D арт-контентаКак выбрать разрешение для фонов игр, персонажей и окружения в Unity?Частый вопрос: «Я делаю 2D-игру в Unity для PC и мобильных: какое разрешение выбрать для своего контента?», «Какое разрешение для фонов игр, бэкграундов (backgrounds) выбрать?», «Как выбрать разрешения для разных элементов игры?». На эти вопросы нет простого ответа, который подошёл бы во всех случаях. Попробуем определиться, как лучше поступить в ваших проектах.
В последние время, Unity работает над большим количеством фич, которые помогают создавать 2D игры в Unity: атласы спрайтов (Sprite atlassing), 2D физика, карты плиток (Tilemap) для прямоугольных, шестиугольных и изометрических миров, основанные на кривых формы спрайтов (Sprite shape), 2D анимация, и т. д. Пиксели не главное!Unity не выражает размеры объектов в пикселях и это может запутать художников, которые создают контент для 2D игр. Насколько большими изображения должны быть? Какое разрешение для фонов игр выбрать? Как обычно в разработке игр, ответ на этот вопрос «Зависит от…». Давайте рассмотрим несколько моментов, которые помогут выбрать решение. Если ты пиксель-арт художник, должен предупредить: большинство советов не в полной мере применимы к тебе. В пиксель-арт графике используют очень низкое разрешение. Обычно нужно, чтобы оно было кратно 2х, 4х, 8х, или больше, чем оригинальное разрешение. Это означает, что один пиксель оригинального изображения отображается как квадрат 2×2, 4×4 или 8×8 реальных пикселей на экране. Так что в целом, в пиксель-арте, тебе не нужно слишком сильно беспокоиться о разрешении экрана. Стоит сосредоточиться на арте, и ощущениях, которые вы хотите передать (old-school, NES-эра, новый пиксель-арт высокого разрешения и т. д.) и затем масштабировать его в несколько раз. У Unity есть решение Pixel Perfect в виде пакета. Оно поставляется как простой компонент, который добавляется на камеру и будет делать тяжелую работу за тебя. Можешь быть уверен, что графика останется четкой и выровненной по сетке, с маленькими аккуратными пикселями на любом экране. Масштабирование вниз, а не вверхПрежде чем мы углубимся в рассмотрение вопроса о выборе разрешения, стоит помнить, что когда ты создаёшь контент, лучше выбрать более высокое разрешение, даже если на самом деле это не нужно для изображений, которые пойдут в игру. Ты всегда сможешь уменьшить разрешение графики, но не сможешь увеличить разрешение без потери качества. Например, когда выбираешь разрешение для фонов игр, начинать с высоты меньше 2160px точно не стоит. Случаи бывают разные: возможно, тебе придется распечатать несколько артов для игры, или понадобится увеличить размер элементов на экране, или ты захочешь создать «HD-версию» своей игры для 4К мониторов позже. По этим причинам, когда начинаешь работать над контентом, надо обдумать использование рабочих файлов, которые будут с большим разрешением, чем действительно нужно. При экспорте можно уменьшить их перед добавлением в Unity, или использовать параметры импорта, чтобы уменьшить их размер, перед импортом в проект. Параметры импорта также позволяют определить максимальный размер и параметры сжатия для каждой платформы, например, вы можете иметь разный контент для разных разрешений на ПК и на мобильных устройствах, где дисковое пространство имеет решающее значение. Совет: Unity предлагает способ объединить несколько спрайтов в один через атласы спрайтов (Sprite Atlases). Помимо того, что это способ сэкономить на размере текстур, атласы также предлагают единый способ управления максимальным размером, вместо того, чтобы устанавливать его индивидуально для каждого спрайта в проекте. Определение разрешения для вашей платформы. Разрешение для фонов игр должно быть больше!При определении размера контента, важно учитывать платформы и устройства, на которых выйдет игра. У людей очень разнообразные устройства и экраны, и они увидят игру в разных разрешениях и соотношениях сторон. 4K и Full HDНа момент написания этого поста, подавляющее большинство пользователей имеют 2 разрешения. В основном «Full HD» (1920×1080 пикселей, часто называют 1080p) и много 1280×720 (часто называют 720р). Небольшой процент людей также имеют мониторы 4K (3840×2160) или мониторы Retina на компьютерах Mac. Современный 15-и дюймовый MacBook Pro будет иметь максимальное разрешение 3360×2100. Это очень много пикселей! Для телефонов тоже разброс огромный. Некоторые старые устройства могут быть менее 720 пикселей по вертикали, а некоторые будут достигать и 4K. Retina (товарный знак Apple) и другие современные экраны с высокими разрешениями, в то время как их реальное аппаратное разрешение очень высокое (например 4К), могут симулировать пониженное разрешение (как правило, половину, например, Full HD, а не 4К), но потом, при рендере изображений и текста, используют вдвое больше пикселей, поэтому изображение отображается довольно чётко. Примечание: DPI (точек на дюйм) или PPI (точек на дюйм, или пикселей на дюйм) это разные названия (взаимозаменяемы) от разных производителей. Означают они одно и то же: сколько пикселей содержит линия длинной в дюйм на экране. Традиционно, экраны имеют 72 DPI. Сегодня высокий DPI экранов, как правило, 144 точек на дюйм, но можно найти телефоны, которые могут похвастаться 400-ми точками на дюйм или более, они содержат много пикселей на относительно маленьких экранах. Обдуманный выборДля этих экранов, у тебя есть два варианта. Первый: стремиться к тому, чтобы предложить впечатление от 4K в полном объеме. Недостатком является то, что производимый 4К-совместимый контент потребует много лишней работы. В этом случае, надо не забыть похвалиться в своих маркетинговых материалах :). Владельцы консолей, типа PS4 Pro и Xbox One X, которые совместимы с 4K, будут рады, что игра использует их оборудование на полную мощность. Второй вариант: можно спроектировать игру для Full HD. Пользователи с более высоким разрешением мониторов не получат преимуществ от разрешения их экранов. Они будут видеть игру в Full HD качестве. Это не супер, но хорошее решение, если ты также пытаешься сохранить размер игры под контролем. Суть такова: нужно выбрать максимальное разрешение, которого хочешь достичь (на основе текущих потребностей рынка, желания и сил), и установить его в качестве целевого для всего проекта. Измерения на сцене в UnityUnity измеряет расстояния и размеры просто в юнитах (unit), а не в пикселях. Хорошая практика, когда соответствие такое: 1 юнит (unit) в Unity = 1 метр. Например, модель среднего человека между 1,7 и 1,8 юнита в таком случае. Это не обязательно, но это будет гарантировать, что игры с физикой (3D и 2D) будут вести себя корректно. Потому что физика в Unity (по умолчанию) настроена использовать 1 юнит на метр. Также это будет хорошо для 3D освещения. Световые параметры рассчитаны на это и останутся верными реальности. В 2D это правило размеров является менее важным, но хорошая практика, если используешь физику в своём проекте. Если используется тайлмап, неплохо сохранить масштаб 1 плитка (tile) = 1 юнит (unit), просто для простоты. Камера в UnityТеперь, когда мы закончили с единицами, перейдём к камере. Unity 2D камеры (ортогональные или, если хотите, ортографические, т. к. в Unity это просто камеры без перспективы) имеют параметр называемый «Размер» (Size), который определяет, сколько юнитов (будет удвоено!) поместится по вертикальной оси этой камеры. С размером 5, мы получим вьюпорт (видимое пользователем поле), который имеет 10 юнитов Unity по вертикали. Горизонтальная ось будет просто следовать за вертикальной. Так как мы не знаем, каким соотношением сторон будет обладать экран пользователя. Но, это легко рассчитать: на обычном ПК или телефоне, с соотношением сторон 16:9, можно так: 10 (Вертикальный размер) x 16 / 9 = 17.7 (Горизонтальный размер) Так мы знаем, что с этими параметрами, наш вьюпорт примерно 17.7 на 10 юнитов. На Маках (которые обычно 16:10) это будет 16 к 10 (т. е. меньше видно по горизонтали). На 16:9 телефоне, если держать его вертикально (так он становится 9:16), та же камера будет показывать только площадь 5.6 на 10 юнитов. Примечание: мы не будем разбирать всё о соотношении сторон тут. Если ты стремишься сделать игру для разных пропорций, нужно не только думать о графике, но также нужно сделать много геймплейных ухищрений, чтобы убедиться, что игра не играется по-разному на устройствах с различными соотношениями сторон. Например, игрок в любой игре, которая прокручивается по горизонтали будет иметь преимущество на горизонтальных пропорциях, потому что игрок сможет увидеть больше опасностей впереди. Иногда сделать игру, которая прекрасно работает на горизонтальных экранах нельзя. Игроки получат рамки, черные полосы для заполнения пространства, которое нельзя использовать во время игры. Пикселей на юнитПри импорте графики, спрайтов, Unity отображает параметр, называемый пикселей на юнит (PPU). Теперь, когда мы знаем о юнитах, всё должно быть очень понятно. Он выражает сколько пикселей вашего спрайта помещается в юните на сцене Unity, когда игровой объект в масштабе 1,1,1. Скажем для примера, у меня есть спрайт камня 218 на 175 пикселей, и я задаю пикселей на юнит в 100, когда я перетащу спрайт на сцену, мой объект по умолчанию будет 2.18 на 1.75 юнитов, занимающих приблизительно одну пятую из 10 юнитов по вертикальной оси экрана. Возьмём Full HD экран, как нашe тестовое разрешение. 1080 пикселей по вертикали, а камень менее пятой части экрана. Можно увидеть, как полупрозрачные камни помещаются больше, чем 5 раз на изображении выше. Мы используем 175 точек исходного изображения для отображения более чем 200 пикселей. Это означает, что мы будем иметь немного размытые камни. Чтобы исправить это, у нас есть несколько вариантов: мы можем уменьшить масштаб камня в половину, сделать размер кадра камеры больше, до 10,8 (это приведёт к приближению) или мы можем изменить значение PPU спрайта до 108 (это произведёт тот же эффект, уменьшит камень на экране). Во всех трех случаях, если мы хотим, чтобы камень быть четким, он должен быть меньше. Как определяется размер камеры и значение PPU? Для размера камеры, если мы импортируем нашу графику как 100 PPU, нам потребуется 10.8 камеры, потому что 10.8×100 равна 1080. Это позволяет нам охватывать всю высоту экрана. И наоборот, для расчета правильной PPU, где размер камеры остается на 5, если мы хотим охватить Full HD экран с 10 юнитами Unity по вертикали, то у нас 1080/10 = 108. Это количество пикселей, которые мы должны запихивать в один блок, если не меняем размер камеры. Правила можно нарушатьКогда ты работаешь над игрой, опасно смешивать все настройки. Это может закончится тем, что ты запутаешься, и какая-то графика будет размыта. Хорошо придерживаться рекомендации: одна настройка PPU для большинства контента в проекте, и типовой размер камеры. После, можно нарушить эти правила. Возможно в процессе тестирования выяснится, что твои фоновые изображения велики. Разрешение для фонов игр сложно подобрать сразу. Оставить тот же PPU не получится, иначе в итоге получатся огромные текстуры. В этом случае нормально уменьшить PPU для таких элементов и импортировать уменьшенные спрайты. Предпросмотр игрыUnity приятно удивляет тем, что разрешение, которое видно через предварительный просмотр «Game View» довольно точное превью целевой платформы. Большинство вариантов, которые нужны, будут в верхнем выпадающем меню и слайдере рядом с ним. Пропорции определяют соотношения между шириной и высотой, но они будут использовать текущее разрешение вашего вьюпорта «Game View», который, в свою очередь, зависит от вашего экрана. И они хороши для настройки пользовательского интерфейса и объектов на экране, но не для тестирования контента. Пока отмечен флажок на чекбоксе Low Resolution Aspect Ratio будет имитироваться низкий DPI. Если отключишь его, он будет отображать стандартное разрешение и DPI твоего экрана. Подстройка под разрешения, сильная сторона Unity для отображения окна точного размера.Можно расширить «Game View» или развернуть его на полный экран. При этом ползунок «Масштаб» (Scale) может подогнать высокие разрешения под твоё окно «Game View». Ещё можно добавить собственные разрешения и соотношение сторон. Совет: надо помнить, что до конца основываться на том, что видно во вьюпорте не стоит. Всегда делая сборку игры, надо обязательно проверять на целевом устройстве или экране. ИтогиПонятно, разрешение изображений, размер камеры и размеры экрана на котором будет игра, всё тесно связано. Не бывает одного размера пикселей или PPU, которые подходят для всех случаев. Исследуй целевую платформу, определяй нужное разрешение. Делай контент в более высоком разрешении в любом случае, это пригодится позже! А по необходимости, уменьшай перед импортом в Unity. И последняя мысль. Возможно, что в твоей игре некоторые объекты иногда находятся в пониженном разрешении. Особенно, если много мелких деталей на экране. Может быть, прозрачные перекрытия, какой-то туман, дождь или пост-обработки поверх. Поиграй в игру на нормальной скорости и обрати внимание, видно ли это и будут ли какие-то проблемы со слегка размытыми изображениями? Если не видно разницы, то, возможно не стоит тратить дополнительные силы, дисковое пространство и лишние вычислительные мощности на визуализацию твоего контента в высоком разрешении. Рисовать уровень целиком сложно не зависимо от того какое разрешение для фонов игр ты выбрал. Всегда есть возможность попробовать создать 2D-уровень основанный на картах тайлов (плиток). Система «Tilemap» отличный выбор для начинающих. Создание интерфейса (UI) под разные разрешения экранаСовременные игры и приложения часто нуждаются в поддержке широкого спектра различных разрешений экрана, и особенно в данной возможности нуждаются интерфейсы этих игр. Система создания интерфейсов в Unity снабжена рядом различных инструментов для реализации этих возможностей, которые также можно комбинировать между собой массой различных способов. В данном руководстве о том “как это делается”, мы собираемся использовать простой пример, чтобы взглянуть и сравнить между собой различные инструменты в контексте данного вопроса. В нашем случае как показано ниже, у нас по углам имеется три кнопки и нашей целью является адаптировать данную компоновку под разные разрешения.
Для данного руководства о том “как это делается” мы решили использовать четыре разрешения экрана: Phone HD в портретной ориентации (640 x 960) и альбомной (960 x 640) и Phone SD также в портретной (320 x 480) и альбомной (480 x 320). Изначально компоновка была настроена под Phone HD портретную ориентацию и разрешение. Using anchors to adapt to different aspect ratiosЭлементы интерфейса по-умолчанию привязаны к центру родительского прямоугольника. Данное означает что они сохраняют постоянное смещение относительно центра. Если с данной настройкой разрешение было изменено под альбомное соотношение сторон, кнопки могут выпасть из своих прямоугольных областей, где они изначально должны были быть расположены.
Одним из способов сохранить расположение кнопок в области экрана является изменение компоновки таким образом, чтобы места их расположения были связаны с их соответствующими углами на экране. Привязка левой верхней кнопки может быть также установлена в левом верхнем углу при использовании в инспекторе выпадающего списка Anchors Preset (наборы привязок), или путём перетаскивания треугольных ручек привязок в видовом окне сцены (Scene View). Лучше сделать это пока текущее разрешение экрана, установленное в игровом режиме (Game View) является тем разрешением, для которого изначально всё и было задумано, где места расположения кнопок были бы подобраны более разумно и как говориться к месту.(Ознакомьтесь со страницей UI Basic Layout для получения более подробной информации по привязкам.). Так же например привязки для левой нижней и правой нижней кнопок могут быть выставлены в левый нижний и правый нижний угол соответственно. Как только кнопки были привязаны к своим углам, то при дальнейших изменениях разрешений экрана и соотношений сторон они будут сохранять свою позиции относительно этих углов.
Когда разрешение экрана изменяется на большее и меньшее относительно текущего, кнопки должны по прежнему сохранять своё изначальное расположение относительно углов, к которым они привязаны. Однако, сохраняя своё оригинальное разрешение, заданное в пикселях, они могут становиться как больше так и меньше, соответствуя пропорциям текущего разрешения экрана. Всё это может быть, а может и не быть желательно, в зависимости от того, как вы хотите, чтобы ваш интерфейс реагировал на смену разрешения экрана.
Данное означает что кнопки должны становиться меньше настолько же, насколько в процентном соотношении становиться меньше сам экран. Другими словами, масштаб кнопок должен быть привязан к масштабу размеров экрана. Вот где может помочь компонент Reference Resolution Масштабирование с компонентом Screen SizeВ компоненте Canvas Scaler вы можете установить его UI Scale Mode в Scale With Screen Size. В данном режиме масштабирования вы можете определить какое разрешение использовать в качестве базового. Если текущее разрешение больше или меньше базового, фактор масштабирования компонента Canvas устанавливается соответственно так, чтобы все элементы интерфейса масштабировались в большую или меньшую сторону вместе с разрешением экрана. In our case, we set the Canvas Scaler to be the Phone HD portrait resolution of 640 x 960. Now, when setting the screen resolution to the Phone SD portrait resolution of 320 x 480, the entire layout is scaled down so it appears proportionally the same as in full resolution. Everything is scaled down: The button sizes, their distances to the edges of the screen, the button graphics, and the text elements. This means that the layout will appear the same in the Phone SD portrait resolution as in Phone HD portrait; only with a lower pixel density.
Чего стоит опасаться: так это того, что после добавления компонента Reference Resolution, важно также проверять как будет выглядеть компоновка с другими соотношениями сторон. Установив разрешение обратно в Phone HD альбомное, можно заметить как кнопки стали больше, чем должны быть (и для чего должны были быть использованы).
Причина, по которой кнопки при альбомном соотношении сторон становятся больше кроется в том, как работают настройки базового разрешения (Reference Resolution). По-умолчанию они сравнивают ширину текущего разрешения с шириной базового и как результат всё на экране масштабируется основываясь на коэффициенте масштабирования, получаемом из этой разницы. Если текущее альбомное разрешение равное 960 x 640 превосходит в 1.5 раза ширину портретного базового разрешения равного 640 x 960, то вся компоновка в целом будет увеличена в 1.5 раза. Компонент имеет свойство под названием Match, которое может принять значение равное 0 (ширина), 1 (высота) или любое значение лежащее в пределах между 0 и 1. По-умолчанию оно установлено в 0, что означает то, что текущая ширина экрана соответствует базовой ширине базового разрешения, о котором говорилось ранее. Если свойство Match имеет значение не равное 0.5, оно будет сравнивать текущую ширину с базовой шириной, текущую высоту с базовой высотой, и выберет коэффициент масштаба близкий и к тому и к другому разрешению. At this point the layout supports all the four screen resolutions using a combination of appropriate anchoring and the Canvas Scaler component on the Canvas.
Для более подробной информации о том, какими ещё способами можно добиться масштабирования элементов интерфейса относительно разных разрешений экрана, посетите страницу документации Canvas Scaler.
|