XRoom_Unity/Assets/Scripts/ScreenShot/ScreenShot.cs

125 lines
3.7 KiB
C#

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class ScreenShot : MonoBehaviour
{
[Header("API Settings")]
[SerializeField] private string apiUrl = "http://my.xroomapp.com:8000/uploadImage/";
[SerializeField] private string screenshotName = "Screenshot";
[Header("Cooldown Settings")]
[SerializeField] private float screenshotCooldown = 5f;
private bool canTakeScreenshot = true;
[Header("Camera Setup")]
[SerializeField] private Camera BackCamera;
[SerializeField] private Camera selfieCamera;
[SerializeField] private RenderTexture tr;
private Camera activeCamera;
void Start()
{
SetActiveCamera(BackCamera); // Start with back camera by default
}
public void ToggleCamera()
{
if (activeCamera == BackCamera)
{
SetActiveCamera(selfieCamera);
}
else
{
SetActiveCamera(BackCamera);
}
}
private void SetActiveCamera(Camera cameraToActivate)
{
BackCamera.gameObject.SetActive(cameraToActivate == BackCamera);
selfieCamera.gameObject.SetActive(cameraToActivate == selfieCamera);
activeCamera = cameraToActivate;
}
public void TakeAndUploadScreenshot()
{
if (canTakeScreenshot)
{
StartCoroutine(CaptureAndUploadScreenshot());
}
else
{
Debug.Log("Screenshot on cooldown. Please wait.");
}
}
private IEnumerator CaptureAndUploadScreenshot()
{
canTakeScreenshot = false;
// Store currently active camera
Camera previousCamera = activeCamera;
yield return new WaitForEndOfFrame();
// Store the original active RenderTexture
RenderTexture originalRT = RenderTexture.active;
// Create temporary RenderTexture
RenderTexture tempRT = new RenderTexture(Screen.width, Screen.height, 24);
// Render camera to the temporary RenderTexture
activeCamera.targetTexture = tempRT;
activeCamera.Render();
RenderTexture.active = tempRT;
// Read pixels into a Texture2D
Texture2D screenshot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
screenshot.Apply();
// Cleanup: restore original targets
//activeCamera.targetTexture = null;
RenderTexture.active = originalRT;
tempRT.Release();
Destroy(tempRT);
// Convert screenshot to PNG
byte[] imageBytes = screenshot.EncodeToPNG();
Destroy(screenshot);
// Upload to server
WWWForm form = new WWWForm();
form.AddField("name", screenshotName);
form.AddBinaryData("image", imageBytes, "screenshot.png", "image/png");
using (UnityWebRequest www = UnityWebRequest.Post(apiUrl, form))
{
string token = EN.instance.Me.token;
www.SetRequestHeader("Authorization", "token " + token);
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.Success)
{
Debug.Log("Screenshot uploaded successfully!");
}
else
{
Debug.LogError("Error uploading screenshot: " + www.error);
EN.instance.showError("Upload Failed", www.error);
}
}
// Restore active camera state
SetActiveCamera(previousCamera);
BackCamera.targetTexture=tr;
selfieCamera.targetTexture=tr;
yield return new WaitForSeconds(screenshotCooldown);
canTakeScreenshot = true;
}
}