"потраченный" билд под андроид

Общие вопросы о Unity3D

"потраченный" билд под андроид

Сообщение Kakaha_228 30 апр 2023, 23:05

Вернулся к старому симулятору автомобиля, на этот раз решил перенести на надроид. Уже в теме по скриптингу писал об одной проблеме, но та проблема была видна ещё в редакторе, а на этот раз уже в билде всё пошло наперекосяк. Сразу скажу, что ради эксперимента сделал билд этого же проекта на версии редактора 5.6.7f1 и та всё было нормально, а текущие билды делаю на 2020.3.47f1. В общем, при запуске игры на любом телефоне с соотношением сторон больше, чем 16:9, игра тупо растягивается на весь экран, но на некоторых девайсах не залазит под шторку (на большинстве залазит). Я уже снимал галку с пункта "Render outside safe area", но это не дало результата... Что самое интересное, так это то, что при запуске я вижу логотип в нормальном соотношении сторон (и т.п.), но сразу через секунду всё это дело растягивается. А затем происходит вообще дичь какая-то: если в настройках нажать кнопку "применить" то изображение на экране просто поплывёт: по вертикали канвас сожмётся, а всё остальное горизонтально растянется. И это не лечится перезагрузкой сцены или переходом на другую сцену, это лечится лишь перезаходом. Я уж думал дело в скрипте настроек, но ведь на 5.6.7f1 этой проблемы нет...

Вот снимок из редактора, как это должно было выглядеть:




Вот снимок с одного из телефонов, как это выглядит на деле:





Так же делал сборку и под Windows и там всё нормально было...

Я вообще не могу понять, в чём дело. Обыскал интернет и ничего подобного не нашёл...
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: "потраченный" билд под андроид

Сообщение 1max1 30 апр 2023, 23:35

Обычно такое бывает, когда якоря синие стоят на элементах канваса. Или канвас настроен криво, к примеру режим в ворлд спейсе и масштаб по Х растянут, ну или совсем крайний вариант проблемы с rect камеры. Попробуй пересоздать канвас в режиме оверлея с привязкой к центру у всех элементов.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: "потраченный" билд под андроид

Сообщение Kakaha_228 01 май 2023, 17:15

Провёл эксперимент: создал новый проект и в него добавил скрипт настроек, проверенный "годами" и в нём так же при сохранении настроек изображение сжалось. Скрипт брал от Nullcode...
Вот сам скрипт:
Синтаксис:
Используется csharp
public class QualitySettingsMenu : MonoBehaviour {

        [SerializeField] private Dropdown resolutions = null; // разрешение экрана
        [SerializeField] private Dropdown qualityPreset = null; // пресеты качества (настраиваются в редакторе)
        [SerializeField] private Dropdown antiAliasing = null; // сглаживание
        [SerializeField] private Dropdown shadowQuality = null; // качество теней
        [SerializeField] private Dropdown shadowRes = null; // разрешение теней
        [SerializeField] private Dropdown textureRes = null; // разрешение текстур
        [SerializeField] private Dropdown anisotropic = null; // анизотропная фильтрация
        [SerializeField] private Button applyButton = null; // кнопка применения настроек и их сохранения
        [SerializeField] private Button revertButton = null; // кнопка возврата настроек, для текущего пресета
        [SerializeField] private Toggle fullscreenToggle = null; // вкл/выкл полноэкранный режим
        [SerializeField] private Toggle vSyncToggle = null; // вкл/выкл вертикальная синхронизация
        private int[] aliasing = new int[]{0, 2, 4, 8};
        private int[] texRes = new int[]{0, 1, 2, 3};
        private int[] af = new int[]{0, 2, 4, 8, 16};
        private string[] shadowQualityList, shadowResolutionList, qualityNamesList;
        private Resolution[] resolutionsList;
        private int aniso;

        void Awake()
        {
                resolutionsList = Screen.resolutions;
                qualityNamesList = QualitySettings.names;
                shadowQualityList = System.Enum.GetNames(typeof(ShadowQuality));
                shadowResolutionList = System.Enum.GetNames(typeof(ShadowResolution));
                Load();
                BuildMenu();
        }

        void Load()
        {
                QualitySettings.shadows = (ShadowQuality) System.Enum.Parse(typeof(ShadowQuality), PlayerPrefs.GetString("shadowQuality", QualitySettings.shadows.ToString()));
                QualitySettings.vSyncCount = PlayerPrefs.GetInt("vSync", QualitySettings.vSyncCount);
                vSyncToggle.isOn = (QualitySettings.vSyncCount > 0) ? true : false;
                QualitySettings.antiAliasing = PlayerPrefs.GetInt("aliasing", QualitySettings.antiAliasing);
                QualitySettings.masterTextureLimit = PlayerPrefs.GetInt("texRes", QualitySettings.masterTextureLimit);
                QualitySettings.shadowResolution = (ShadowResolution) System.Enum.Parse(typeof(ShadowResolution), PlayerPrefs.GetString("shadowRes", QualitySettings.shadowResolution.ToString()));
                aniso = PlayerPrefs.GetInt("aniso", 16);
                AnisoFiltering(aniso);
                fullscreenToggle.isOn = Screen.fullScreen;
        }

        void Save()
        {
                PlayerPrefs.SetInt("vSync", QualitySettings.vSyncCount);
                PlayerPrefs.SetInt("aliasing", aliasing[antiAliasing.value]);
                PlayerPrefs.SetInt("texRes", QualitySettings.masterTextureLimit);
                PlayerPrefs.SetString("shadowRes", QualitySettings.shadowResolution.ToString());
                PlayerPrefs.SetString("shadowQuality", QualitySettings.shadows.ToString());
                PlayerPrefs.SetInt("aniso", af[anisotropic.value]);
                PlayerPrefs.Save();
        }

        string ResToString(Resolution res)
        {
                return res.width + " x " + res.height;
        }

        void RefreshDropdown()
        {
                resolutions.RefreshShownValue();
                qualityPreset.RefreshShownValue();
                antiAliasing.RefreshShownValue();
                shadowRes.RefreshShownValue();
                textureRes.RefreshShownValue();
                anisotropic.RefreshShownValue();
                shadowQuality.RefreshShownValue();
        }

        void BuildMenu()
        {
                resolutions.options = new List<Dropdown.OptionData>();
                qualityPreset.options = new List<Dropdown.OptionData>();
                antiAliasing.options = new List<Dropdown.OptionData>();
                shadowRes.options = new List<Dropdown.OptionData>();
                textureRes.options = new List<Dropdown.OptionData>();
                anisotropic.options = new List<Dropdown.OptionData>();
                shadowQuality.options = new List<Dropdown.OptionData>();

                for(int i = 0; i < resolutionsList.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = ResToString(resolutionsList[i]);
                        resolutions.options.Add(option);
                        if(resolutionsList[i].height == Screen.height && resolutionsList[i].width == Screen.width) resolutions.value = i;
                }

                for(int i = 0; i < qualityNamesList.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = QualityNames(qualityNamesList[i]);
                        qualityPreset.options.Add(option);
                }

                for(int i = 0; i < aliasing.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = (aliasing[i] == 0) ? "Выключено" : aliasing[i] + "x Multi Sampling";
                        antiAliasing.options.Add(option);
                        if(aliasing[i] == QualitySettings.antiAliasing) antiAliasing.value = i;
                }

                for(int i = 0; i < texRes.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = TextureResolutionNames(texRes[i]);
                        textureRes.options.Add(option);
                }

                for(int i = 0; i < af.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = (af[i] == 0) ? "Выключено" : af[i] + "x";
                        anisotropic.options.Add(option);
                        if(af[i] == aniso) anisotropic.value = i;
                }

                for(int i = 0; i < shadowQualityList.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = ShadowQualityNames(shadowQualityList[i]);
                        shadowQuality.options.Add(option);
                }

                for(int i = 0; i < shadowResolutionList.Length; i++)
                {
                        Dropdown.OptionData option = new Dropdown.OptionData();
                        option.text = ShadowResolutionNames(shadowResolutionList[i]);
                        shadowRes.options.Add(option);
                        if(shadowResolutionList[i].CompareTo(QualitySettings.shadowResolution.ToString()) == 0) shadowRes.value = i;
                }

                shadowQuality.value = (int)QualitySettings.shadows;
                textureRes.value = QualitySettings.masterTextureLimit;
                qualityPreset.value = QualitySettings.GetQualityLevel();
                qualityPreset.onValueChanged.AddListener(delegate{ApplyPresets();});
                applyButton.onClick.AddListener(()=>{ApplySettings();});
                revertButton.onClick.AddListener(()=>{PresetsSettings();});

                RefreshDropdown();
        }

        void PresetsSettings() // настройки пресетов по умолчанию
        {
                switch(qualityPreset.value)
                {
                case 0:
                        QualitySettings.vSyncCount = 0;
                        QualitySettings.antiAliasing = 0;
                        QualitySettings.masterTextureLimit = 3;
                        QualitySettings.shadows = ShadowQuality.Disable;
                        QualitySettings.shadowResolution = ShadowResolution.Low;
                        anisotropic.value = 0;
                        AnisoFiltering(af[0]);
                        break;

                case 1:
                        QualitySettings.vSyncCount = 0;
                        QualitySettings.antiAliasing = 0;
                        QualitySettings.masterTextureLimit = 2;
                        QualitySettings.shadows = ShadowQuality.HardOnly;
                        QualitySettings.shadowResolution = ShadowResolution.Low;
                        anisotropic.value = 0;
                        AnisoFiltering(af[0]);
                        break;

                case 2:
                        QualitySettings.vSyncCount = 0;
                        QualitySettings.antiAliasing = 0;
                        QualitySettings.masterTextureLimit = 1;
                        QualitySettings.shadows = ShadowQuality.All;
                        QualitySettings.shadowResolution = ShadowResolution.Medium;
                        anisotropic.value = 1;
                        AnisoFiltering(af[1]);
                        break;

                case 3:
                        QualitySettings.vSyncCount = 0;
                        QualitySettings.antiAliasing = 0;
                        QualitySettings.masterTextureLimit = 0;
                        QualitySettings.shadows = ShadowQuality.All;
                        QualitySettings.shadowResolution = ShadowResolution.Medium;
                        anisotropic.value = 2;
                        AnisoFiltering(af[2]);
                        break;

                case 4:
                        QualitySettings.vSyncCount = 1;
                        QualitySettings.antiAliasing = 2;
                        QualitySettings.masterTextureLimit = 0;
                        QualitySettings.shadows = ShadowQuality.All;
                        QualitySettings.shadowResolution = ShadowResolution.High;
                        anisotropic.value = 3;
                        AnisoFiltering(af[3]);
                        break;

                case 5:
                        QualitySettings.vSyncCount = 1;
                        QualitySettings.antiAliasing = 4;
                        QualitySettings.masterTextureLimit = 0;
                        QualitySettings.shadows = ShadowQuality.All;
                        QualitySettings.shadowResolution = ShadowResolution.VeryHigh;
                        anisotropic.value = 4;
                        AnisoFiltering(af[4]);
                        break;
                }

                int j = 0;
                foreach (string res in System.Enum.GetNames(typeof(ShadowResolution)))
                {
                        if(res.CompareTo(QualitySettings.shadowResolution.ToString()) == 0) shadowRes.value = j;
                        j++;
                }

                vSyncToggle.isOn = (QualitySettings.vSyncCount > 0) ? true : false;
                textureRes.value = QualitySettings.masterTextureLimit;
                shadowQuality.value = (int)QualitySettings.shadows;

                for(int i = 0; i < aliasing.Length; i++)
                {
                        if(aliasing[i] == QualitySettings.antiAliasing) antiAliasing.value = i;
                }

                RefreshDropdown();
        }

        void ApplyPresets() // применение пресетов
        {
                QualitySettings.SetQualityLevel(qualityPreset.value, true);
                PresetsSettings();
        }

        void AnisoFiltering(int value)
        {
                if(value > 0)
                {
                        QualitySettings.anisotropicFiltering = AnisotropicFiltering.ForceEnable;
                        Texture.SetGlobalAnisotropicFilteringLimits(value, 16);
                }
                else
                {
                        QualitySettings.anisotropicFiltering = AnisotropicFiltering.Disable;
                }
        }

        void ApplySettings()
        {
                AnisoFiltering(af[anisotropic.value]);
                QualitySettings.vSyncCount = (vSyncToggle.isOn) ? 1 : 0;
                QualitySettings.masterTextureLimit = texRes[textureRes.value];
                QualitySettings.shadows = (ShadowQuality) System.Enum.Parse(typeof(ShadowQuality), shadowQualityList[shadowQuality.value]);
                QualitySettings.shadowResolution = (ShadowResolution) System.Enum.Parse(typeof(ShadowResolution), shadowResolutionList[shadowRes.value]);
                QualitySettings.antiAliasing = aliasing[antiAliasing.value];
                Screen.SetResolution(resolutionsList[resolutions.value].width, resolutionsList[resolutions.value].height, fullscreenToggle.isOn);
                Save();
        }

        string TextureResolutionNames(int value)
        {
                if(value == 0)
                {
                        return "Высокое";
                }
                else if(value == 1)
                {
                        return "Среднее";
                }
                else if(value == 2)
                {
                        return "Низкое";
                }
                else if(value == 3)
                {
                        return "Минимальное";
                }

                return "Error";
        }

        string ShadowQualityNames(string value)
        {
                if(value.CompareTo("HardOnly") == 0)
                {
                        return "Низкое";
                }
                else if(value.CompareTo("Disable") == 0)
                {
                        return "Выключено";
                }
                else if(value.CompareTo("All") == 0)
                {
                        return "Высокое";
                }

                return "Error";
        }

        string ShadowResolutionNames(string value)
        {
                if(value.CompareTo("High") == 0)
                {
                        return "Высокое";
                }
                else if(value.CompareTo("Low") == 0)
                {
                        return "Низкое";
                }
                else if(value.CompareTo("Medium") == 0)
                {
                        return "Среднее";
                }
                else if(value.CompareTo("VeryHigh") == 0)
                {
                        return "Максимальное";
                }

                return "Error";
        }

        string QualityNames(string value)
        {
                if(value.CompareTo("Very Low") == 0)
                {
                        return "Минимум";
                }
                else if(value.CompareTo("Low") == 0)
                {
                        return "Низко";
                }
                else if(value.CompareTo("Medium") == 0)
                {
                        return "Средне";
                }
                else if(value.CompareTo("High") == 0)
                {
                        return "Высоко";
                }
                else if(value.CompareTo("Very High") == 0)
                {
                        return "Очень высоко";
                }
                else if(value.CompareTo("Ultra") == 0)
                {
                        return "Максимально";
                }

                return "Error";
        }
}
 
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: "потраченный" билд под андроид

Сообщение Alkos26Rus 01 май 2023, 20:20

Синтаксис:
Используется csharp
Screen.SetResolution(resolutionsList[resolutions.value].width, resolutionsList[resolutions.value].height

наверно из за этого
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25