When you add a game to the Apple App Store or Google Play Store, you need screenshots in many different dimensions. The screenshots are meant to show the game as it appears on various phones and tablets with many different sizes.
In Unity, I wrote a script to take the screenshots from a PC build. I can specify a list of the dimensions for as many screenshots as I need, and the location of a folder to save them.
In a PC build, when I right-click, it pauses the game by setting Time.timescale to 0, then it resizes the game window to the first size in my list, such as 800x600, it waits a moment so the UI can update it’s position, then it saves a screenshot as a PNG file, moves to the next size in my list, and repeats until it’s taken all the screenshots I need. After it’s done, it resumes the game by setting Time.timescale back to 1.
The problem I found, was that Windows and Mac both prevented the game from having a width or height larger than my display size. My display is 3440x1440, and I needed a screenshot at 2732x2048, but was getting a screenshot taken at 2732x1440. I believe this would not be a problem on a 4K display, multiple displays that expand the desktop, or maybe with a virtual desktop.
The solution I found was to use my video card. In the Nvidia Control panel, I made a fake custom resolution of 6880x2880, and then I was able to take the screenshots. There was a popup warning that doing this could damage your display, so be careful if you try it, but it worked fine for me.
Here’s the script I wrote:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class screenShot : MonoBehaviour
{
// Singleton instance for easy access from other scripts
public static screenShot instance;
// Flag to enable/disable screenshot functionality
public bool takeScreenshots = false;
// Default location to save screenshots
//Windows//
public string screenshotLocation = "C:\\Users\\yourName\\Desktop\\screenshots";
//Mac//
//public string screenshotLocation = "/Users/yourName/Desktop/screenshots";
// Array of resolutions to cycle through when taking screenshots
public string[] resolutions;//640x480 etc;
// Private variables for tracking screen dimensions and screenshot process
private int width;
private int height;
private int screenN;
private bool scalingScreen = false;
private bool takingScreens = false;
private float waitF;
// Singleton pattern to ensure only one instance exists
void Awake()
{
if (instance)
{
// Destroy duplicate instances
Destroy(gameObject);
}
else
{
// Set the instance to this object and persist across scenes
instance = this;
DontDestroyOnLoad(gameObject);
}
}
// Set screen resolution based on the provided string
public void setXY(string _res)//separated ints with x//
{
// Split the resolution string into width and height
string[] splitNs = _res.Split('x');
width = int.Parse(splitNs[0]);
height = int.Parse(splitNs[1]);
// Set the screen resolution
Screen.SetResolution(width, height, false);
}
// Update is called once per frame
void Update()
{
// Check if screenshot functionality is enabled
if (takeScreenshots)
{
// Start taking screenshots when right mouse button is pressed
if (!takingScreens)
{
if (Input.GetMouseButtonDown(1))
{
// Play a sound effect
//soundManager.sound.playSFX(26);
// Initialize variables for taking screenshots
screenN = 0;
scalingScreen = true;
takingScreens = true;
Time.timeScale = 0f;
}
}
// Scale the screen resolution
else if (scalingScreen)
{
if (Time.realtimeSinceStartup > waitF)
{
// Set the screen resolution and update wait time
setXY(resolutions[screenN]);//resolution will not update until the next frame//
waitF = Time.realtimeSinceStartup + 2f;
scalingScreen = false;// Stop scaling
}
}
//take screenshots//
else
{
if(Time.realtimeSinceStartup > waitF)
{
// Capture screenshot
takeScreenshot(screenN);
// Check if more screens to capture
if (screenN + 1 < resolutions.Length)
{
screenN++;
scalingScreen = true;// Start scaling for the next resolution
waitF = Time.realtimeSinceStartup + 2f;
}
//finished taking screenshots
else
{
takingScreens = false;
Time.timeScale = 1f;// Resume the game
}
}
}
}
}
// Capture screenshot with a given index in resolutions array
void takeScreenshot(int _num)
{
// Save the screenshot with a filename containing resolution and timestamp
ScreenCapture.CaptureScreenshot(screenshotLocation + "\\haunt"+ resolutions[_num]+"_"+System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png");
}
}