Я получил много ответов на этот вопрос, но все они являются общими и, как правило, не очень полезными. Ни в одном из учебных пособий не говорится о соотношении сторон и работе с мобильными устройствами, и существует миллион способов сделать это, у всех, похоже, есть свои недостатки и недостатки.
Мне бы очень хотелось узнать, какие успешные игры используются для обработки различных форматов изображения на iOS и Android, не создавая при этом миллионы ресурсов различного размера.
Я, строго говоря, мобильный, а не настольный компьютер, особенно с Unity, и меня не волнует интерфейс, меня интересует только игровой холст.
Проблемы, которые я имею в виду, это когда есть ключевые вещи, которые должны быть в определенных местах и не могут выпасть из экрана. Использование черных полос сверху или снизу недопустимо в наши дни.
источник
Ответы:
Вам нужно ограничить область просмотра камеры портретной или альбомной ориентацией (в зависимости от ваших потребностей) с помощью вычислительных
camera.orthographicSize
свойств, чтобы вы могли построить 2-мерную сцену независимо от соотношения сторон и разрешения:Если вам нужна дополнительная информация по этому вопросу, пожалуйста, спросите, и я отвечу. ;) С уважением и ура.
ОБНОВЛЕНИЕ: используйте скрипт привязки объектов Eliot Lash вместе с этим, чтобы при необходимости размещать объекты на ключевых позициях на экране (относительно углов / границ экрана). Если вы это сделаете, переименуйте «CameraFit» в «ViewportHandler».
Предварительный просмотр, имитирующий различные форматы экрана:
источник
GetComponent<Camera>().orthographicSize = UnitSize / 2f;
для портрета / определения единиц высотыКак правило, вам не нужны разные размеры ресурсов - импортированные текстуры и спрайты с автоматически сгенерированными картами MIP будут хорошо смотреться при рендеринге с любым размером, меньшим или равным исходному размеру пикселя изображения.
Макет сцены является проблемой. Один хороший подход заключается в следующем (и к вашему сведению я использую 3D-камеру, смотрящую на 2D-контент, расположенный в точке z = 0):
В кодовой форме:
источник
Если вы прибегаете к использованию баров, то на самом деле это довольно просто реализовать (я публикую это, хотя ФП высказал мнение, что это неприемлемо, потому что он имеет преимущество, заключающееся в том, что он не так уж плох на мобильных устройствах, и это простое решение, которое не требует никакого кода вообще)
Camera.orthographicSize
переменная внутри ортокамеры (которую использует большинство 2D игр), которая соответствует измеренному количеству игровых единиц вертикально на экране ( деленное на 2 ) ( источник ). Таким образом, выберите соотношение сторон, которое подходит подавляющему большинству устройств (я выбрал 16: 9, так как большинство исследованных экранов составляют 16: 9, 16:10, 3: 2) и добавьте маску, которая перекрывает это соотношение.Пример :
В моей игре (не перечисленной здесь, так как это не реклама, можете попросить в комментариях при желании) мы используем портретный режим. Чтобы сделать простое 16: 9, я сделал свою камеру Ortho размером 16. Это означает, что камера будет приспосабливать 32 игровые единицы высоты (у: 16-16 в моем случае) к вертикали экрана устройства.
Затем я поместил черные маски с игрой между -9 и +9. Вуаля, экран игры выглядит одинаково на всех устройствах и немного тоньше на устройствах, которые немного шире. У меня не было абсолютно никаких отрицательных отзывов относительно масок. Для создания пейзажа просто переверните эти значения, и тогда вы сделаете камеру размером 9. Измените значения так, чтобы они соответствовали тому, что вы решили в соответствии с масштабом вашей игровой единицы.
Единственное место, где мы наблюдали черную полосу, - 3: 2 на iPad. Даже тогда у меня не было жалоб.
источник
Я делаю это в игре, над которой я сейчас работаю. У меня есть фоновое изображение 1140x720. Самые важные биты (те, которые никогда не должны быть обрезаны) содержатся в средней области 960x640. Я запускаю этот код в функции запуска моей камеры:
Я также определяю размеры, отличные от размера шрифта для кнопок и тому подобное. Он хорошо работает на всех соотношениях сторон, которые я тестировал. Прошло много времени с тех пор, как я его настроил, поэтому я могу пропустить шаг. Дайте мне знать, если это не сработает, как ожидалось, и я посмотрю, если я что-то пропустил.
источник
Ответ и код @ Марселя великолепны и помогли мне понять, что происходит. Это окончательный ответ. Просто подумал, что кто-то может найти полезным то, что я в итоге сделал для моего конкретного случая: так как я хотел, чтобы что-то действительно очень простое, один спрайт всегда был на экране, я придумал несколько строк:
Я добавил это в камеру и перетащил свой спрайт (это мой фон) в единственное свойство скрипта. Если вам не нужны чёрные полосы (горизонтальные или вертикальные), вы можете поставить больший фон за этим ...
источник
Есть несколько способов решения этой проблемы, и не существует идеального решения (по крайней мере, я его еще не нашел), и тип используемого вами решения будет сильно зависеть от типа игры, в которой вы находитесь. разработки.
Независимо от того, что вы делаете, вы должны начать с выбора минимально возможного разрешения, которое вы хотели бы поддерживать, и построить свои спрайты для этого разрешения. Так что если вы заинтересованы в разработке для iOS, то, согласно http://www.iosres.com/, самое низкое разрешение устройства iOS - 480x320.
Оттуда вы можете начать увеличивать спрайты до более высоких разрешений. Предостережение заключается в том, что в конечном итоге вы начнете замечать, что спрайты начинают размываться по мере увеличения масштаба, и в этом случае вы можете переключиться на другой набор спрайтов, созданный для более высоких разрешений.
Или вы можете полностью игнорировать масштабирование и просто решить отображать больше игрового экрана для более высоких разрешений (я полагаю, именно так Terraria делает это, например). Однако для многих игр это не подходит; соревновательные игры например.
Это? Многие игры, которые хотят использовать соотношение сторон 4: 3, делают это. Поскольку вы используете Unity, вы можете использовать скрипт AspectRatioEnforcer, чтобы помочь в этом.
источник
Есть несколько способов решения этой проблемы, это зависит от вашей игры и того, что будет работать лучше всего. Например, в нашей игре Tyrant Unleashed мы просто делали широкие карты с неважной детализацией по бокам, чтобы можно было обрезать стороны на более узких устройствах. Однако другие игры могут быть лучше с подходом, в котором вы фактически перемещаете кнопки или что-то, чтобы лучше соответствовать экрану.
(Также частью нашего подхода является поддержание постоянной высоты на всех устройствах, только изменяя ширину. Это, безусловно, облегчает нам жизнь, но, опять же, это может или не может быть полезным для вашей конкретной игры. Это не имеет значения в наш художественный стиль, если изображения немного масштабируются на разных экранах, в то время как это может иметь значение для чего-то вроде пиксельной графики. По сути, это подход «пусть Unity справится с этим»)
источник
Я использую следующий скрипт, который добавляет
targetAspect
параметр к камере и адаптирует его в соответствииorthographicSize
с соотношением сторон экрана (подробнее в этом сообщении в блоге ):источник
Мой метод в основном похож на решения, предоставленные другими :) Я постараюсь подробно объяснить подход, который я использую, чтобы сделать игру независимой от размера экрана.
Ориентация экрана
В зависимости от ориентации экрана (альбомная или книжная) необходимо учитывать, будет ли камера масштабироваться с фиксированной высотой или фиксированной шириной. В основном я выбираю фиксированную ширину для пейзажно-ориентированных игр и фиксированную высоту для портретно-ориентированных игр.
Масштабирование камеры
Как уже говорилось, это может быть либо фиксированная высота, либо фиксированная ширина.
Фиксированная высота : вертикальная область игры всегда будет соответствовать высоте экрана. А по мере изменения соотношения сторон экрана слева и справа от экрана будет добавлено дополнительное пространство. Чтобы реализовать это, вам не нужно ничего кодировать, это стандартное поведение камеры для единства.
Фиксированная ширина : горизонтальная область игры всегда будет соответствовать ширине экрана. А дополнительное пространство будет добавлено сверху и снизу при изменении соотношения сторон экрана. Для реализации этого вам нужно написать небольшой кусочек кода. Позже убедитесь, что вы удалили функцию обновления формы кода и поместили ее в активное состояние.
В редакторе вы можете изменить targetWidth, чтобы определить область мирового пространства, которую вы хотите отобразить. Этот код объясняется в следующем видео вместе со многими другими практиками для 2D-игр :)
Unite 2014 - 2D лучшие практики в Unity
Соотношение сторон
Следующее соотношение сторон, перечисленное от самого широкого до самого узкого, охватывает практически все размеры экрана как для Android, так и для iOS
Я обычно устанавливаю все эти пропорции в заданном порядке под окном игры, так как это удобно при тестировании на экранах разных размеров :)
Расходная область
Это область, которая добавляется на экран по бокам или сверху / снизу в зависимости от выбранного вами масштаба камеры.
Для фиксированной высоты все игровые элементы должны предпочтительно соответствовать соотношению 16: 9, которое является самым узким. И фон должен расширяться до 5: 4. Что гарантирует, что ваша игра никогда не имеет черных полос по бокам.
Для фиксированной ширины это почти то же самое, но здесь элементы должны соответствовать соотношению 5: 4, а BG должен быть увеличен до 16: 9.
Bounds
Иногда мы не можем использовать подход с использованием расходных площадей, поскольку нам нужно использовать весь доступный экран для игры.
Например, рассмотрим портретную игру с фиксированной высотой, ловящую монеты, падающие с неба. В этом нам нужно дать игроку возможность перемещаться горизонтально по доступной ширине экрана.
Следовательно, нам нужны границы камеры в терминах мировых координат, чтобы знать, где именно слева, справа, сверху или снизу камеры закрепляются на мировой позиции.
Мы также можем использовать эти границы для привязки игровых элементов или пользовательского интерфейса к желаемой стороне камеры.
Используя Camera.ViewportToWorldPoint, мы можем получить границы bounds.Viewport по отношению к камере. Нижний левый угол камеры (0,0); верхний правый - (1,1). Положение z в мировых единицах измерения от камеры. Для 2D / орфографических Z не имеет значения.
UI
Для пользовательского интерфейса мы можем применять те же понятия, которые мы использовали для игровых элементов. После внедрения Unity5 UI и наличия плагинов, таких как NGUI, это не будет большой проблемой :)
источник
Я создал Unity Asset 'Resolution Magic 2D', чтобы решить эту проблему (объявление: вы можете получить его в Unity Asset Store или узнать подробности на grogansoft.com).
Я решил эту проблему следующим образом ...
Определите область экрана, которая всегда должна быть видимой независимо от соотношения сторон / разрешения, и используйте простое преобразование прямоугольника, чтобы «растянуть» эту область. Это ваша идеальная форма экрана. Используя простой алгоритм, я затем увеличиваю камеру, пока область, заблокированная прямоугольником, не станет настолько большой, насколько это возможно, и при этом будет на 100% видимой для камеры.
Тогда ваша основная игровая зона всегда занимает как можно больше экрана. И до тех пор, пока имеется достаточно «дополнительного» контента (например, вашего фона) за пределами области прямоугольника, которую вы определили ранее, игроки, чей экран не имеет такое же соотношение сторон, как ваш «идеальный» прямоугольник, будут видеть дополнительный контент, где в противном случае черные полосы были бы идти.
Мой актив также включает некоторую логику для размещения пользовательского интерфейса, но это в основном устарело из-за новой системы пользовательского интерфейса Unity.
Мой ресурс предоставляет это из коробки с минимальной настройкой, и он действительно хорошо работает на всех платформах.
Если вы используете эту технику (или мой актив), просто убедитесь, что вы разрабатываете свою игру так, чтобы вокруг нее было «дополнительное» пространство для размещения экранов, которые шире или выше вашего идеала (чтобы избежать черных полос).
Я лично не делаю 3D-игры, поэтому я не знаю, будет ли это работать в 3D (или даже если это необходимо).
Без картинок это действительно сложно объяснить, поэтому, пожалуйста, посетите мой сайт ( Resolution Magic 2D )
источник
Лучшее решение для меня - использовать теорему о пересекающихся линиях, чтобы не было ни среза по сторонам, ни искажения игрового вида. Это означает, что вы должны сделать шаг назад или вперед в зависимости от разного соотношения сторон.
источник
Я создал расширение AssetStore, которое упрощает переключение аспектов под названием AspectSwitcher . Он предоставляет систему, позволяющую легко указывать разные свойства для разных аспектов. Как правило, есть два метода, которые большинство людей используют для переключения аспектов. Одним из них является предоставление различных игровых объектов для каждого аспекта. Другой заключается в создании пользовательского кода, который изменяет свойства одного игрового объекта на основе текущего аспекта. Как правило, это требует много пользовательского кодирования. Мое расширение пытается облегчить эту боль.
источник