Как я делаю скриншоты для App Store

Когда вы добавляете игру в Apple App Store или Google Play Store, вам нужны снимки экрана в разных размерах. На скриншотах показано, как игра выглядит на различных телефонах и планшетах разных размеров.

Делайте скриншоты Unity в нескольких размерах одновременно

В Unity я написал скрипт для создания скриншотов сборки ПК. Я могу указать список размеров для любого количества снимков экрана и расположение папки для их сохранения.

В сборке ПК, когда я щелкаю правой кнопкой мыши, игра приостанавливается, устанавливая для Time.timescale значение 0, затем изменяется размер окна игры до первого размера в моем списке, например 800x600, он ждет некоторое время, чтобы пользовательский интерфейс мог обновиться. это позиция, затем он сохраняет снимок экрана в виде файла PNG, переходит к следующему размеру в моем списке и повторяет это до тех пор, пока не будут сделаны все нужные мне снимки экрана. После этого игра возобновляется, устанавливая Time.timescale обратно в 1.

Сделайте снимок экрана Unity, размер которого превышает размер дисплея.

Проблема, которую я обнаружил, заключалась в том, что и Windows, и Mac не позволяли игре иметь ширину или высоту, превышающую размер моего дисплея. Мой дисплей имеет разрешение 3440x1440, и мне нужен был снимок экрана с разрешением 2732x2048, но я получал снимок экрана с разрешением 2732x1440. Я считаю, что это не будет проблемой для дисплея 4K, нескольких дисплеев, расширяющих рабочий стол, или, возможно, для виртуального рабочего стола.

Решение, которое я нашел, заключалось в использовании моей видеокарты. В панели управления Nvidia я сделал поддельное пользовательское разрешение 6880х2880, после чего смог делать скриншоты. Появилось всплывающее предупреждение о том, что это может повредить ваш дисплей, поэтому будьте осторожны, если попробуете, но у меня все сработало.

Видео переведено через ElevenLabs

Вот сценарий, который я написал:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class screenShot : MonoBehaviour
{
    // Экземпляр Singleton для быстрого доступа из других скриптов.
    public static screenShot instance;

    // Флаг для включения/отключения функции создания снимков экрана
    public bool takeScreenshots = false;

    // Место по умолчанию для сохранения снимков экрана

    //Windows//
    public string screenshotLocation = "C:\\Users\\yourName\\Desktop\\screenshots";

    //Mac//
    //public string screenshotLocation = "/Users/yourName/Desktop/screenshots";


    // Массив разрешений для переключения при создании снимков экрана
    public string[] resolutions;//640x480 etc;

    // Частные переменные для отслеживания размеров экрана и процесса создания снимков экрана
    private int width;
    private int height;
    private int screenN;
    private bool scalingScreen = false;
    private bool takingScreens = false;
    private float waitF;

    // Шаблон Singleton, обеспечивающий существование только одного экземпляра
    void Awake()
    {
        if (instance)
        {
            // Уничтожить повторяющиеся экземпляры
            Destroy(gameObject);
        }
        else
        {
            // Установите экземпляр для этого объекта и сохраняйте его в разных сценах.
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }

    // Установите разрешение экрана на основе предоставленной строки
    public void setXY(string _res)//separated ints with x//
    {
        // Разделите строку разрешения на ширину и высоту.
        string[] splitNs = _res.Split('x');
        width = int.Parse(splitNs[0]);
        height = int.Parse(splitNs[1]);

        // Установите разрешение экрана
        Screen.SetResolution(width, height, false);
    }


    // Обновление вызывается один раз для каждого кадра
    void Update()
    {
        // Проверьте, включена ли функция создания снимков экрана
        if (takeScreenshots)
        {
            // Начинайте делать снимки экрана при нажатии правой кнопки мыши.
            if (!takingScreens)
            {
                if (Input.GetMouseButtonDown(1))
                {
                    // Воспроизвести звуковой эффект
                    //soundManager.sound.playSFX(26);

                    // Инициализируйте переменные для создания снимков экрана
                    screenN = 0;
                    scalingScreen = true;
                    takingScreens = true;
                    Time.timeScale = 0f;
                }
            }
            // Масштабируйте разрешение экрана
            else if (scalingScreen)
            {
                if (Time.realtimeSinceStartup > waitF)
                {
                    // Установите разрешение экрана и время ожидания обновления.
                    setXY(resolutions[screenN]);//разрешение не обновится до следующего кадра//
                    waitF = Time.realtimeSinceStartup + 2f;
                    scalingScreen = false;// Остановить масштабирование
                }
            }
            //делать скриншоты//
            else
            {
                if(Time.realtimeSinceStartup > waitF)
                {
                    // Сделать снимок экрана
                    takeScreenshot(screenN);

                    // Проверьте, есть ли еще экраны для захвата
                    if (screenN + 1 < resolutions.Length)
                    {
                        screenN++;
                        scalingScreen = true;// Начать масштабирование для следующего разрешения

                        waitF = Time.realtimeSinceStartup + 2f;
                    }
                    //закончил делать скриншоты
                    else
                    {
                        takingScreens = false;
                        Time.timeScale = 1f;// Возобновить игру
                    }
                }
            }
        }
    }

    // Захват скриншота с заданным индексом в массиве разрешений
    void takeScreenshot(int _num)
    {
        // Сохраните снимок экрана с именем файла, содержащим разрешение и метку времени.
        ScreenCapture.CaptureScreenshot(screenshotLocation + "\\haunt"+ resolutions[_num]+"_"+System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png");
    }

}