Este post pretende desvelar cómo capturar la pantalla y compartirla en las redes en un app Android programada con Unity3d usando el lengua C#.
El objetivo de este post es, al igual que en esta otra entrada, el de ir desvelando poco a poco el código que hace funcionar el app del proyecto artístico «Never Gone Forever», con el fin de que pueda ser usado libremente por quien pueda necesitarlo.
Este post presupone ciertos conocimientos técnicos básicos sobre el entorno de desarrollo Unity3d y el lenguaje de programación C#. Estas son las dos funciones principales que hacen la magia:
using System.Collections;
using UnityEngine;
using System.IO;
(...)
public void ButtonShare()
{
Debug.Log("El botón llama a la función correctamente");
if (!isProcessing)
{
StartCoroutine(ShareScreenshot());
}
}
public IEnumerator ShareScreenshot()
{
isProcessing = true;
// Espera que rendericen los gráficos
yield return new WaitForEndOfFrame();
// Crea la textura
Texture2D screenTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, true);
// Pone la textura en el buffer
screenTexture.ReadPixels(new Rect(0f, 0f, Screen.width, Screen.height), 0, 0);
// Aplica
screenTexture.Apply();
// Codifica la imagen a ceros y unos, especifica el destino y escribe los bytes
byte[] dataToSave = screenTexture.EncodeToPNG();
string destination = Path.Combine(Application.persistentDataPath, System.DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ".png");
File.WriteAllBytes(destination, dataToSave);
if (!Application.isEditor)
{
// Evita abrir el archivo y en su lugar lo comparte
AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
intentObject.Call
AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
AndroidJavaObject uriObject = uriClass.CallStatic
intentObject.Call
intentObject.Call
intentObject.Call
intentObject.Call
intentObject.Call
AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unity.GetStatic
currentActivity.Call("startActivity", intentObject);
}
isProcessing = false;
}
Para capturar la pantalla y compartirla, solo faltaría que, en cualquier lugar de nuestra aplicación, se llame a la función ButtonShare()
, que a su vez llamará a la función ShareScreenshot()
. En realidad ButtonShare()
solo sirve para evitar que el usuario comience una captura de pantalla cuando todavía no se ha terminado la anterior, con el fin, entiendo, de evitar errores. En Never Gone Forever el método se llama desde un botón situado en la esquina superior izquierda:
private void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 60, 60), "compartir"))
{
ButtonShare();
}
}