Проблемы с разрешением при портировании игры Unity на Android

9

Итак, я впервые портирую игру на Android в Unity3D. И я столкнулся с несколькими проблемами по пути. Моя текущая проблема в том, что разрешение кажется неправильным, оно обрезает края экрана, и мои остановки прокрутки для прокрутки экрана влево / вправо больше не находятся в нужном месте.

После небольшого исследования многие люди говорят, что вам нужно сделать свою игру независимой от разрешения, чтобы она могла работать на всех устройствах Android / Iphone / Ipad. Это правда? Если да, то как мне это сделать? Если нет, то как я могу помочь исправить разрешение, чтобы при переносе на мобильные устройства оно выглядело правильно?

РЕДАКТИРОВАТЬ: я до сих пор не имею то, что мне нужно, разрешения по-прежнему не работают должным образом, даже с кодом и приемами, перечисленными ниже. Мне нужно каким-то образом настроить разрешение в зависимости от устройства. По какой-то причине, когда я пытаюсь получить разрешение устройства, используя код Мунгоида, он возвращает 0x0

Тимоти Уильямс
источник
1
Вам нужно будет пройти через любой фрагмент кода, который предполагает определенное разрешение экрана, и изменить его, чтобы он мог брать текущее разрешение экрана и что-то с ним делать. В зависимости от того, что вы делаете и как, не существует универсального решения.
Тетрад
Что касается специфики, то этот вопрос идет в некоторые детали (есть много вопросов по этому поводу на сайте) gamedev.stackexchange.com/questions/51/...
Тетрадь
Ааа, так в основном то, что сказал Намар: «Убедитесь, что вы размещаете все с соотношениями. Например, панель состояния будет размещена на 80% ширины экрана и 10% ширины экрана для ее горизонтального масштаба», так как я могу исправить ссылки конкретные области в космосе? Моя прокрутка экрана происходит из-за определенных областей в мировом пространстве, но это, кажется, перепутано с изменениями разрешения.
Тимоти Уильямс
Не могли бы вы более конкретно рассказать о своей проблеме? Вы говорите, что разрешение «кажется неправильным» и «все еще выключено», но разрешение экрана обычно является фиксированным свойством устройства. Так что это не разрешение, а неправильный способ рендеринга на экран. Если вы сделаете предположение о том, насколько широким и высоким является экран, у вас всегда будут проблемы на разных устройствах и форматах изображения.
Kylotan
Полагаю, на самом деле я пытаюсь написать код, чтобы найти самое низкое разрешение, установить для него игру и соответствующим образом масштабировать все объекты. Я знаю, как установить масштаб игрового поля, но я не могу получить разрешение устройства. поэтому игра "слишком сильно увеличена", или все слишком велико.
Тимоти Уильямс

Ответы:

7

Проблема, с которой вы столкнетесь в Android, заключается в том, что у каждого устройства есть свой размер экрана, разрешение и плотность пикселей. Если вы хотите, чтобы ваша игра выглядела одинаково на всех устройствах, вам предстоит много работы и, вероятно, вы никогда не будете довольны результатами. Либо игра будет выглядеть растянутой на широкоэкранных дисплеях или сжатой на не широкоформатных. Я предлагаю вам решить, что действительно важно, и позволить чему-то еще немного скользить.

Без каких-либо скриншотов или знаний о том, что представляет собой ваша игра и как она выглядит, мы все можем строить предположения о решениях, но у нас нет конкретного направления, чтобы дать вам конкретный совет.

В Unity вы можете получить доступ к размерам текущего экрана с помощью класса Screen : Screen.widthи Screen.height(среди других свойств). Затем вы можете изменить соотношение сторон камеры, чтобы изменить то, что видно на экранах разных размеров, исходя из размеров экрана и ваших личных ожиданий того, что должно быть видно.

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

//GUI values in code are assigned based on an 800x600 screen
private var nativeWidth : float = 800.0f;  
private var nativeHeight : float = 600.0f;
private var guiMatrix : Matrix4x4;

function Start () 
{
    var scale : Vector3 = Vector3(Screen.width / nativeWidth, 
                                  Screen.height / nativeHeight,
                                  1.0f);
    guiMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
}

function GetGUIMatrix() : Matrix4x4
{
    return guiMatrix;
}

Затем в реальных OnGUI()функциях я сразу установил матрицу преобразования:

function OnGUI()
{
    GUI.matrix = guiScale.GetGUIMatrix();
    /* Everything Else */
}
chaosTechnician
источник
Установка соотношения сторон камеры на основе ширины и высоты экрана не помогает, когда телефон в вертикальном положении, он вообще не отображается, а в горизонтальном положении он выглядит точно так же, как и раньше. Игра разделена на три части, вы плавно прокручиваете пальцем между разделами (как в Angry Birds), вот изображение того, как должна выглядеть левая сторона. И середина . Вот левая сторона, когда мой телефон держится вертикально ,
Тимоти Уильямс
И вот горизонтально . Надеюсь, эти картинки помогут, я впервые портирую с Unity на Android или даже создаю игру для Android. Я немного потерян.
Тимоти Уильямс
Судя по (моей интерпретации) вашим объяснениям и вашим фотографиям, проблема не в разрешении; Ваша камера находится не в том месте, которое может показывать все, что вы хотите на маленьком экране. Уменьшите свои уровни или переместите камеру назад, чтобы показать больше или что-то еще. Я бы посоветовал установить в вашем игровом окне намного меньший размер, чтобы он соответствовал реальному устройству, а не 1230х530, которые у вас есть, чтобы вы могли почувствовать, что вы увидите, когда перевернете его.
ХаосТехник
Проблема в том, что я уже достаточно сильно уменьшил камеру. Если эта проблема будет сохраняться, как я могу точно учесть различные экраны и размеры и изменить их?
Тимоти Уильямс
@TimothyWilliams, вы, вероятно, могли бы что-то решить, выбрав минимальное разрешение (800x600 или около того), с которым работает ваша игра. Затем используйте Screen.widthи .heightв сочетании с Camera.fieldOfViewи Camera.aspectдля воспроизведения того же представления на экранах произвольного размера. Это просто потребовало бы некоторого трига, чтобы определиться, как это сделать.
хаосТехник
0

Вы можете попробовать что-то вроде следующего и применить его. Я предполагаю, что мобильное устройство должно возвращать только одно разрешение.

function Start()
{
    var resolutions : Resolution[] = Screen.resolutions;
    // Print the resolutions
    for (var res in resolutions) {
        print(res.width + "x" + res.height);
    }
    // Switch to the lowest supported fullscreen resolution
    Screen.SetResolution (resolutions[0].width, resolutions[0].height, true);
};

Также посмотрите здесь для получения дополнительной информации об Экране в единстве http://unity3d.com/support/documentation/ScriptReference/Screen.html

Mungoid
источник
Это мне не помогло, разрешение все еще выключено.
Тимоти Уильямс
По какой-то причине он возвращает «0x0» на моем Android ...
Тимоти Уильямс