Cómo tomar una captura de pantalla desde dentro de tu juego en Unity

Nunca es una mala idea brindarles a sus jugadores una manera fácil de tomar capturas de pantalla desde su juego, sin tener que hacerlo de forma indirecta.

Algunas plataformas tienen una forma de tomar capturas de pantalla de cualquier juego que se ejecute en sus plataformas sin necesidad de usar software externo. Steam, por ejemplo, le permite presionar F12 para tomar una captura de pantalla. Pero, ¿qué sucede si su juego no usa esas plataformas, o si desea tomar capturas de pantalla para hacer algo, como configurar miniaturas para los archivos guardados?

Se puede tomar una captura de pantalla en un juego de Unity simplemente llamando al método CaptureScreenshot de la clase ScreenCapture, es decir, ScreenCapture.CaptureScreenshot(“/”). Esto creará una captura de pantalla de tu juego en formato PNG en la ruta que especifiques.

Hay varias cosas que debe tener en cuenta. Voy a entrar en más detalles sobre cómo guardar correctamente las capturas de pantalla a continuación, ¡así que asegúrate de seguir leyendo!

Tabla de contenido

Cómo tomar una captura de pantalla en un juego de Unity

Se puede tomar fácilmente una captura de pantalla mediante programación llamando al método ScreenCapture.CaptureScreenshot en cualquier momento. La captura de pantalla generada será la pantalla que ves actualmente en el juego y estará en formato PNG.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ScreenshotManager : MonoBehaviour { public void TakeScreenshot() { ScreenCapture.CaptureScreenshot("TestImage.png"); } }

Code language: C# (cs)

El código anterior generará una captura de pantalla llamada «TestImage.png» cuando se llame al método TakeScreenshot. La resolución de la captura de pantalla será la resolución actual con la que se tomó la captura de pantalla.

Puede configurar el parámetro superSize del método para aumentar el tamaño de la captura de pantalla resultante:

ScreenCapture.CaptureScreenshot("TestImage.png", 3);

Code language: C# (cs)

El ejemplo anterior hará que la captura de pantalla sea 3 veces más grande que la original. Tenga en cuenta que solo puede tomar un valor entero.

En cuanto a dónde se guarda, si está probando esto en el Editor de Unity, la captura de pantalla se guardará en el directorio raíz de la carpeta del proyecto de su juego.

Para el reproductor independiente, la captura de pantalla se guardará en el directorio «_Data» dentro del directorio de tu juego.

Esto no es ideal, desea que el reproductor pueda reconocer dónde debería estar la captura de pantalla. En la siguiente sección, te enseñaré cómo guardar capturas de pantalla en un directorio específico.

Cómo guardar una captura de pantalla en un directorio específico en Unity

Como se mencionó anteriormente, cuando solo se pasa el nombre del archivo al método ScreenCapture.CaptureScreenshot, el método predeterminará la ubicación de la captura de pantalla en el directorio raíz. No queremos eso.

Las capturas de pantalla deben guardarse en un directorio hecho para tener exclusivamente capturas de pantalla para que estén más organizadas.

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class ScreenshotManager : MonoBehaviour { private string directoryName = "Screenshots"; private string fileName = "TestImage.png"; public void TakeScreenshot() { DirectoryInfo screenshotDirectory = Directory.CreateDirectory(directoryName); string fullPath = Path.Combine(screenshotDirectory.FullName, fileName); ScreenCapture.CaptureScreenshot(fullPath); } }

Code language: C# (cs)

El código anterior intentará crear un directorio llamado «Capturas de pantalla» si aún no existe y luego guardará la captura de pantalla con el nombre «TestImage.png» en ese directorio.

Esto puede parecer un poco confuso, así que déjame desglosarlo por ti.

using System.IO;

Code language: C# (cs)

Esta línea debe incluirse para que cualquier clase y método relacionado con la lectura y escritura de datos esté disponible. Para obtener más información sobre System.IO, consulte la documentación oficial de System.IO Namespace

DirectoryInfo screenshotDirectory = Directory.CreateDirectory(directoryName);

Code language: C# (cs)

El método Directory.CreateDirectory crea un directorio con el nombre especificado en la ruta actual. En este caso, creará un directorio llamado «Capturas de pantalla» en el directorio raíz de su juego, es decir, /Capturas de pantalla.

La razón por la que tenemos que almacenar el valor devuelto (el objeto DirectoryInfo) es para que podamos obtener la ruta completa al directorio creado para usarla más adelante.

Si el directorio ya existe, simplemente devolverá el valor sin crear un nuevo directorio.

string fullPath = Path.Combine(screenshotDirectory.FullName, fileName);

Code language: C# (cs)

El método Path.Combine une varios nombres de rutas. La propiedad FullName del objeto screenshotDirectory le brinda la ruta absoluta al directorio de capturas de pantalla.

En este caso, combinará la ruta absoluta al directorio con el nombre del archivo, que es:

<path_to_your_game>\Screenshots\TestImage.png

Code language: HTML, XML (xml)

Alternativamente, puede combinar la ruta y el nombre del archivo agregando los 2 valores de cadena juntos usando el operador «+» de esta manera:

screenshotDirectory.FullName + "/" + fileName

Code language: C# (cs)

Esto logrará el mismo resultado, pero recomiendo usar el método Path.Combine ya que es más limpio y menos propenso a errores.

¿Por qué tenemos que crear un directorio primero?

Primero debemos crear el directorio en el que queremos almacenar capturas de pantalla porque, de lo contrario, el método ScreenCapture.CaptureScreenshot fallará ya que no puede guardar el archivo en un directorio que no existe.

ScreenCapture.CaptureScreenshot(fullPath);

Code language: C# (cs)

Por último, llamamos al método ScreenCapture.CaptureScreenshot y le pasamos la ruta completa para guardar la captura de pantalla.

Guardar una captura de pantalla en el directorio de documentos

A veces, es mejor guardar capturas de pantalla en el directorio Documentos, ya que es más fácil de encontrar y navegar.

Puede pensar que obtener la ruta al directorio Documentos es complicado, ya que necesitamos saber el nombre de usuario del usuario actual. Pero no te preocupes, hay una manera de hacerlo.

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.IO; public class ScreenshotManager : MonoBehaviour { private string directoryName = "Screenshots"; private string screenshotName = "TestImage.png"; public void SaveScreenshotToDocuments() { string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string screenshotPath = Path.Combine(documentsPath, Application.productName, directoryName); DirectoryInfo screenshotDirectory = Directory.CreateDirectory(screenshotPath); ScreenCapture.CaptureScreenshot(Path.Combine(screenshotDirectory.FullName, screenshotName)); } }

Code language: C# (cs)

Déjame explicarte un poco más en detalle.

using System;

Code language: C# (cs)

Esta línea debe incluirse para que el espacio de nombres del entorno esté disponible para su uso.

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Code language: C# (cs)

El método Environment.GetFolderPath se usa junto con el valor de enumeración Environment.SpecialFolder.MyDocuments para obtener el directorio Documentos del usuario actual. Para obtener más información, consulte la documentación oficial de la clase Environment.

string screenshotPath = Path.Combine(documentsPath, Application.productName, directoryName);

Code language: C# (cs)

Luego combinamos la ruta al directorio Documentos con el nombre de nuestro juego y el nombre del directorio de capturas de pantalla.

DirectoryInfo screenshotDirectory = Directory.CreateDirectory(screenshotPath); ScreenCapture.CaptureScreenshot(Path.Combine(screenshotDirectory.FullName, screenshotName));

Code language: C# (cs)

Luego llamamos a Directory.CreateDirectory para crear el directorio de destino y luego procedemos a generar una captura de pantalla en la siguiente línea.

Agregar una marca de tiempo a una captura de pantalla

El método ScreenCapture.CaptureScreenshot sobrescribe el archivo de captura de pantalla si la captura de pantalla recién tomada tiene el mismo nombre que la que ya existe.

Para evitar esto, agreguemos una marca de tiempo a las capturas de pantalla que creamos. Esto se puede hacer fácilmente con la ayuda de la clase DateTime.

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.IO; public class ScreenshotManager : MonoBehaviour { private string directoryName = "Screenshots"; private string screenshotName = "TestImage"; public void TakeScreenshot() { string timeNow = DateTime.Now.ToString("dd-MMMM-yyyy HHmmss"); ScreenCapture.CaptureScreenshot("Screenshot " + timeNow + ".png"); } }

Code language: C# (cs)

Para obtener más información sobre el formato de fecha y hora, visite la documentación oficial.

Conclusión

Guardar capturas de pantalla puede requerir bastante esfuerzo para hacerlo bien. Espero que hayas aprendido algo nuevo hoy. Utilice lo que ha aprendido aquí y ajústelo a sus necesidades. Incluso puede usar estas técnicas para generar capturas de pantalla en el juego para usar para promocionar su juego.

¡Salud!

Atribución

Icono de cámara realizado por Ilham Fitrotul Hayat de www.flaticon.com