it-swarm.com.ru

Как работать с разными разрешениями экрана

Я использую Unity 4.3.3 для своей игры. Я делаю игру для устройств Android и iOS. Поскольку я довольно новичок в Unity, я не могу найти способ работать с другим разрешением экрана .... Я использую c # для своих сценариев. 

Я хочу, чтобы моя игра работала в полноэкранном режиме. Я протестировал его на iPad 2, и он отлично работает, но для iPhone 4 боковые стороны обрезаны, а для iPhone 5 они еще больше. Каково решение? Какой вариант выбрать в разделе «Настройки проигрывателя»> «iOS»> «Другие настройки»> «Разрешение цели»?

50
Ashish Beuwria

unity меняет свою игровую камеру в соответствии с размерами соотношения сторон экрана, который она использует. Очевидно, что это не всегда желательно, поэтому есть несколько способов обойти это:

1) Первый метод очень прост в реализации, хотя редко выглядит хорошо. Вы можете просто изменить соотношение сторон камеры, чтобы оно соответствовало тому, которое вы разработали для своей игры. Так что если, например, вы разработали свою игру в формате 4: 3, вы бы сделали что-то вроде этого:

Camera.aspect = 4f/3f;

Просто имейте в виду, что это будет искажать игру по разным пропорциям.

2) Другой метод немного сложнее, но результат выглядит намного лучше. Если вы используете орфографическую камеру, важно помнить, что независимо от того, какое разрешение экрана используется, орфографическая камера поддерживает высоту на заданном значении и изменяет только ширину. Например, для орфографической камеры размером 10 высота будет установлена ​​равной 2. С учетом этого вам нужно будет компенсировать максимально широкую камеру на каждом уровне (например, иметь более широкий фон). ) или динамически изменяйте ортогональный размер камеры, пока ее ширина не совпадет с тем, что вы создали.

Компоненты графического интерфейса проще реализовать, просто установив их положение в зависимости от разрешения экрана, где это необходимо. Например, если вы хотите, чтобы кнопка появлялась в верхнем правом углу, вы просто устанавливаете ее положение на что-то вроде position = new Vector2(Screen.width - 50, 50);

Правка: так как вы упомянули устройства, которые вы использовали, я немного поискал, чтобы найти, какое соотношение сторон использует каждый из них: Ipad2 = 4: 3, Iphone4 = 3: 2 и Iphone5 = 16: 9

Так как вы сказали, что на Ipad2 он выглядит идеально, я предполагаю, что вы разработали свою игру, чтобы использовать соотношение сторон 4: 3, поэтому упомянутое вами «ограничение» состоит лишь в том, что ваша орфографическая камера расширилась. Решение состоит в том, чтобы использовать один из двух методов, которые я описал выше.

Вы можете легко увидеть, как это будет выглядеть на каждом устройстве в редакторе Unity. Если вы перейдете на вкладку игры (которая появляется при нажатии play в редакторе Unity), вы увидите, что у нее есть имя устройства, а также разрешение и соотношение сторон. Изменение этого параметра позволит вам увидеть, как оно будет выглядеть при различных соотношениях сторон.

38
Steven Mills

Вы можете попытаться получить разрешение устройства с помощью Camera.ScreenWidth и Camera.ScreenHeight.

Затем выполните некоторые математические расчеты, чтобы рассчитать разницу с имеющимся у вас разрешением и применить ее к родительскому объекту. 

Это будет масштабировать все больше/меньше, чтобы соответствовать разрешению устройства, не имея многократного разрешения изображения и т.д. для устройств с различным разрешением.

4
KennethLJJ

Вам нужно изменить видовой экран камеры в соответствии с соотношением сторон устройства ........ Предположим, вы сделали игру для 720x1080

Затем в сценарии вы должны сделать

float xFactor = Screen.width / 720f;
float yFactor = Screen.height  / 1080f;

Camera.main.rect = new Rect(0,0,1,xFactor/yFactor);

Или же  

Другой способ, если вы делаете игру с соотношением сторон 9:16, то

Сделай это в своем сценарии,

public float targetRatio = 9f/16f; //The aspect ratio of your game
void Start()
{
    Camera cam = GetComponent<Camera>();
    cam.aspect = targetRatio;
}
2
Apurva

Если ваша цель - получить предыдущую ширину:

[RequireComponent(typeof(Camera))]
public class ResizeCamera : MonoBehaviour 
{
    private float   DesignOrthographicSize;
    private float   DesignAspect;
    private float   DesignWidth;

    public  float   DesignAspectHeight;
    public  float   DesignAspectWidth;

    public void Awake()
    {
        this.DesignOrthographicSize = this.camera.orthographicSize;
        this.DesignAspect = this.DesignAspectHeight / this.DesignAspectWidth;
        this.DesignWidth = this.DesignOrthographicSize * this.DesignAspect;

        this.Resize();
    }

    public void Resize()
    {       
        float wantedSize = this.DesignWidth / this.camera.aspect;
        this.camera.orthographicSize = Mathf.Max(wantedSize, 
            this.DesignOrthographicSize);
    }
}
2
SylafrsOne

Я знаю, что это старая ветка, но люди все равно могут найти ответ.

Чтобы настроить перспективную камеру на другие соотношения сторон экрана с другим поведением, чем по умолчанию в Unity, вам потребуется некоторая тригонометрия. Вся необходимая информация об этом находится здесь: https://en.wikipedia.org/wiki/Angle_of_view

Если вы хотите простой выход, вот решение, которое работает со всеми типами камер: http://u3d.as/oUX

1
DominoOne

Самый простой способ, которым я решил это, был, как указал Стивен, принудить соотношение сторон моей перспективной камеры к тому, для которого я разрабатываю. Конечно, это деформирует некоторые объекты, если соотношение сторон, для которого я разработал, отличается от соотношения устройства. Для объектов пользовательского интерфейса, если вы используете встроенную функцию, я создаю прямоугольники на основе процента от любого размера экрана 

Rect(0.5 * Screen.width, 0.5 * Screen.height, 0.25 * Screen.width, 0.25 * Screen.height) 

Это поместит верхний левый угол в центр экрана и создаст прямоугольник 1/4 высоты и 1/4 ширины экрана. Я использую NGUI 2.7 для пользовательского интерфейса, и я не видел никаких проблем с различными соотношениями сторон, и что для визуализации пользовательского интерфейса используется ортографическая камера.

1
user3234091

Хорошо, это большой вопрос. Многие люди ссылались на принудительное соотношение сторон, что является хорошим решением для рассмотрения. Однако для многих игр это не подходит. Для многих игровых проектов вы хотите, чтобы игра выглядела как родная для устройства/экрана, на котором она запущена, и вы хотите использовать каждый квадратный дюйм экрана, который вы можете использовать. Для этого вы должны собрать и протестировать каждую систему в вашей игре для экранов разных размеров и форм. Эта проблема очень похожа на создание приложений и веб-сайтов для нескольких устройств.

Размер экрана

Размер экрана можно получить программным способом, используя DPI и разрешение с помощью следующего выражения:

Resolution res = Screen.currentResolution;
float screenSquareInches = res.width * res.height / Screen.dpi;

Для контента на экране, который просматривается через камеру, есть только одна переменная, которую необходимо масштабировать, и это размер камеры (или сколько вещей в игровом мире будет выдавлено на экран). Вы можете контролировать размер камеры с помощью поля зрения для 3D-игр или ортографического размера для 2D-игр. Только тестирование покажет, какое уравнение поддерживает самый широкий диапазон размеров экрана, но что-то в этом роде может хорошо послужить:

// this should be a tweakable number, so you can fine tune it to your needs. It represents the screen size at which the camera size should not be scaled at all
float expectedScreenArea = 20;
// this number should also be tweakable, which declares how much smaller/larger text can get depending on the screen size. Generally larger screens are viewed from farther away, so scaling should be slight
float cameraScalingRate = 0.25f;
// multiply this number by the default/base camera size you have picked, whether that's field of view or orthographic size
float cameraSizeMultiplier = 1 + (screenSquareInches / expectedScreenArea - 1) * cameraScalingRate;

Хорошо, это поможет вам в большей степени масштабировать игровой мир, но как насчет элементов пользовательского интерфейса, таких как текст, HUD и экранные элементы управления? Что ж, для таких элементов, как текст, вышеприведенное уравнение должно работать прилично, хотя вам может потребоваться другое значение для коэффициента масштабирования. Для элементов управления на экране может потребоваться более полное преобразование, например джойстики, перемещающиеся в нижние углы экрана на планшете, а не по центру, или, если это не устройство с сенсорным экраном, вообще удалите элементы управления на экране. Это выходит за рамки этого вопроса.

Соотношение сторон экрана

Соотношение сторон экрана (насколько он широкий и высокий) также важно и требует отдельной обработки. Как правило, лучший способ сделать это - зафиксировать вертикальную высоту экрана, чтобы по мере того, как экран становился шире, элементы на экране не масштабировались, а по мере того, как экран становился выше, элементы на экране масштабировались пропорционально тому, насколько он выше. экран растет. Это уже поведение по умолчанию для камер, но для элементов пользовательского интерфейса вы должны установить его как таковой. Это относительно просто, если вы используете новую систему пользовательского интерфейса с canvas '. В компоненте CanvasScalar есть свойство , которое управляет масштабированием элементов в зависимости от соотношения сторон. Измените это, чтобы соответствовать ширине или высоте, и имейте это, чтобы соответствовать высоте.

Для дальнейшего рассмотрения

Поддержка различных размеров и форм экрана - это больше, чем просто подгонка. Вы также должны убедиться, что вы играете хорошо на разных экранах. Это варьируется от таких тонких вещей, как отсутствие у игрока чувства клаустрофобии на маленьком экране, от уверенности в том, что враги не могут стрелять в игрока, если он находится за пределами экрана, до необходимости обновления границ, которые держат элементы на экране…. Другой Следует учитывать, что это компьютерная игра: кто-то может подключить свой компьютер к другому экрану или изменить разрешение на лету. Имея это в виду, может быть целесообразно выполнить приведенные выше уравнения по мере необходимости, чтобы игроку не нужно было выходить из игры, чтобы все выровнялось.

1
Semimono

В Asset-store есть бесплатный ресурс по этому вопросу ... Просто посмотрите ...

http://u3d.as/content/palash-bhowmick/fit-all-screen-size/9q9

если форма вашего объекта изменилась, то удалите строки, начинающиеся с: -

transform.localScale.x =

0
user2830124

если у вас нет выбора, вы также можете сделать еще немного работы и добавить специальный скрипт на вашу камеру, который: 

  1. проверяет разрешение экрана для устройства
  2. устанавливает целевое разрешение для этого
  3. а также устанавливает целевое соотношение сторон для этого (ВАЖНО)

все, что вам нужно сделать, это просто написать базовую функцию для проверки разрешения экрана (как ширины, так и высоты для устройств, которые вы хотите), а затем добавить некоторые дополнительные функции для установки правильного разрешения экрана и соотношения сторон!

0
a_m_dev

Если вы разрабатываете 2d игру, то есть ваша камера находится в орфографическом виде, тогда просто сделайте следующий код и прикрепите его к игровому объекту. Он масштабирует игровой объект (в данном случае Sprite) с разрешением экрана.

void Resize()
{
    SpriteRenderer sr=GetComponent<SpriteRenderer>();
    if(sr==null) return;

    transform.localScale=new Vector3(1,1,1);

    float width=sr.Sprite.bounds.size.x;
    float height=sr.Sprite.bounds.size.y;


    float worldScreenHeight=Camera.main.orthographicSize*2f;
    float worldScreenWidth=worldScreenHeight/Screen.height*Screen.width;

    Vector3 xWidth = transform.localScale;
    xWidth.x=worldScreenWidth / width;
    transform.localScale=xWidth;

    Vector3 yHeight = transform.localScale;
    yHeight.y=worldScreenHeight / height;
    transform.localScale=yHeight;

}
0
Shubhra

Это очень просто для Unity Now, так как Unity3D имеет собственную систему пользовательского интерфейса. Для 3D Unity Автоматическая настройка камеры в зависимости от размера экрана. Проблема возникает для пользовательского интерфейса на самом деле, и это немного сложнее. Прежде всего попытайтесь выяснить, какие элементы должны изменить положение и размер в зависимости от размера экрана ........ Например, если у вас есть кнопка точно в центре экрана. Тогда не нужно менять положение в соответствии с экраном. Он останется в центре. 

Теперь давайте рассмотрим сценарий, в котором у вас есть кнопка в углу экрана, как мы видим кнопку паузы в правом верхнем или левом верхнем углу. Теперь вам придется закрепить свою кнопку в углу соответственно. Неважно, на каком размере экрана запущена игра, кнопка паузы должна придерживаться угла. 

Теперь давайте возьмем другой случай, в котором у вас есть фон в вашем меню. Теперь вам придется применить растяжку для этого BG Sprite. Этот BG будет соответственно растягиваться и сжиматься, но все элементы на нем будут иметь фиксированный размер. Для этого рекомендуется, чтобы BG были плоскими, чтобы одна и та же BG могла иметь хорошее качество для 16:10 или 4: 3 (Все о Unity Native UI)

0
Mubasher Ikram