Почему Unity в 2d режиме использует масштабирование и отографический размер по умолчанию, как это происходит?

8

Ранее я использовал SFML, XNA, Monogame и т. Д. Для создания 2-мерных игр, где, если я выведу на экран спрайт в 100 пикселей, он займет 100 пикселей . Если я использую плитки размером 128px для создания фона, первая плитка будет в (0, 0), а вторая будет в (128, 0).

Unity, с другой стороны, имеет свою собственную систему нечетных единиц, масштабирующую все преобразования, от пикселя к единице, отографический размер и т. Д., И т. Д. Итак, мой вопрос двоякий, а именно:

  1. Почему Unity имеет эту систему по умолчанию для 2d? Это для мобильного разработчика? Есть ли большая выгода, которую я не вижу?
  2. Как я могу настроить свое окружение, чтобы при запуске игры в спрайте 128x128 он отображался как спрайт 128x128 в Unity?

Обратите внимание, что я ориентируюсь исключительно на рабочий стол.

неофит
источник
1
Это происходит потому, что Unity был 3D-движком, в который недавно была внедрена 2D-графика. Однако мне бы хотелось получить ответы на все вопросы, чтобы узнать, есть ли у кого-то другой подход лучше, чем у меня.
Джоккинг
Функции графического интерфейса Unity и компонент GUITexture позволяют рисовать текстуры на экране в исходном размере напрямую. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Если вам требуется больше гибкости, лучше всего определить непротиворечивую шкалу - например, 1U = 128 пикселей и примените это последовательно ко всем вашим квадроциклам / спрайтам / камерам.
DMGregory
Я бы избегал класса графического интерфейса Unity; поскольку графический интерфейс непосредственного режима в Unity довольно неэффективен, они строят новую систему графического интерфейса (собирается выпустить ее фактически в версии 4.6).
Джоккинг

Ответы:

4

Обработка 2D-координат и масштабирование в Unity довольно просты, но неочевидны, и, как вы заметили, это не похоже на работу других инструментов разработчика. Это происходит потому, что Unity был 3D-движком, в который недавно была внедрена 2D-графика.

В частности, 1 единица в Unity не обязательно составляет 1 пиксель на изображении. Когда вы импортируете изображения как 2D-спрайты, на самом деле есть параметр Pixels-to-Units, который можно сделать 1: 1, но я рекомендую оставить его по умолчанию 100: 1 по нескольким причинам (физический движок не работает правильно на 1: 1, и по умолчанию лучше для совместимости с чужим кодом).

Этот параметр масштабирования означает, что все позиции делятся на 100. Это довольно легко, если вы всегда помните масштабирование; если вы хотите переместить спрайт на 256 пикселей (скажем), то вы перемещаете его 2.56. Вы также можете написать служебную функцию для округления чисел до 2 десятичных знаков / ближайшего пикселя: Mathf.Round (float * 100) / 100f


Что касается настройки идеальной по пикселям камеры, сначала установите ее как орфографическую камеру. Когда вы выбираете камеру, в ее настройках есть раскрывающийся список для перспективной или орфографической проекции; перспектива означает, что вещи будут выглядеть трехмерными, в то время как орфографическое отображение сцены плоское Прямо под этим раскрывающимся списком находится Размер; установите орфографический размер камеры, равный половине размера экрана, который вы хотите.

Например, допустим, вы хотите экран с разрешением 1024x768, идеально подходящий для пикселей. Ну, это означает, что высота камеры должна быть 384 пикселей. Разделите это на 100 (из-за масштаба пикселей к единицам), и вы получите 3,84 для размера камеры. Опять же, эта математика просто SCREEN_SIZE / 2 / 100f


(Я ждал, чтобы увидеть, какие другие ответы появятся первыми, но это было пару дней. Я некоторое время делал 2D в Unity, используя 2D Toolkit , но я относительно новичок во встроенных функциях 2D)

jhocking
источник
2

Как говорит jhocking, это результат того, что 2D-сшивка превращается в 3D IDE. Но есть решение, оно немного загадочное.

Первый шаг - открыть настройки импорта вашего спрайта на панели проекта. Как только для Типа текстуры задано значение Sprite или Advanced (Advanced предоставляет другие удобные параметры, но Sprite используется по умолчанию, если вы изначально создали 2D-проект), появляется поле Pixels To Units со значением по умолчанию 100.

Я использую систему листов, поэтому я использую плитки размером 16x16 пикселей и устанавливаю Pixels To Units на 16. Математика работает следующим образом: Размер в пикселях (X или Y) / Pixels To Units = Unity Units в Transform , 16-пиксельный куб с PTU 16 занимает 1 единицу в пространстве Unity.

Я еще не пробовал, но я ожидаю, что PTU 1 сделает пиксель идеальным.

Однако настройка камеры с ортогональными изображениями - головная боль. Еще раз, это основано на настройке Pixels to Units, но также и на нескольких других вещах. По сути, это половина высоты экрана от настроек плеера (т.е. 1080, 768, какой бы ни был iPhone 5, не стоит его искать), деленная на пиксели в единицах.

PatrionDigital
источник
1

Пиксельные единицы не являются хорошим способом представления больших миров из-за способа работы чисел с плавающей запятой. С числами с плавающей точкой вы теряете точность с очень большими числами. Числа около 0 имеют лучшую точность. Таким образом, некоторые игровые движки предпочитают систему метрик MKS (Метры / Килограммы / Секунды). Значение Unity по умолчанию равно метрам, поэтому игровые персонажи могут быть легко представлены с высотой 1,0-2,0 метра с очень хорошей точностью.

Средний вес и рост мужчины составляют около 50 кг и 1,8 метра. Если вы попытаетесь сделать символ высотой 1200 пикселей, его вес составит около 33 000 пикселей. Если вы хотите добавить в игру очень тяжелый объект, такой как автобус, у вас будет огромное количество пикселей. Вы можете легко увидеть, как это может привести к очень неточным вычислениям для столкновений.

Если вы твердо намерены использовать пиксельные единицы, вы можете легко рассчитать соотношение пикселей и метров.

LVBen
источник
Но все это не относится к большинству двумерных игр, которым вообще не нужно использовать физику. Проблема в том, что Unity предлагает поддержку 2D, но она очень элементарна и требует много изучения, чтобы упростить то, что вам действительно нужно из 2D движка.
Кокодоко