You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Feel/MMTools/Tools/MMUtilities/MMScreenshot.cs

139 lines
4.5 KiB
C#

3 months ago
using UnityEngine;
using System.IO;
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
using UnityEngine.InputSystem;
#endif
namespace MoreMountains.Tools
{
/// <summary>
/// Add this class to an empty game object in your scene and it'll let you take screenshots (meant to be used in Editor)
/// </summary>
[AddComponentMenu("More Mountains/Tools/Utilities/MMScreenshot")]
public class MMScreenshot : MonoBehaviour
{
/// the name of the folder (relative to the project's root) to save screenshots to
public string FolderName = "Screenshots";
/// the method to use to take the screenshot. Screencapture uses the API of the same name, and will let you keep
/// whatever ratio the game view has, RenderTexture renders to a texture of the specified resolution
public enum Methods { ScreenCapture, RenderTexture }
[Header("Screenshot")]
/// the selected method to take a screenshot with.
public Methods Method = Methods.ScreenCapture;
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
/// the key to press to restart manually
public Key ScreenshotKey = Key.K;
#else
/// the shortcut to watch for to take screenshots
public KeyCode ScreenshotShortcut = KeyCode.K;
#endif
/// the size by which to multiply the game view when taking the screenshot
[MMEnumCondition("Method", (int)Methods.ScreenCapture)]
public int GameViewSizeMultiplier = 3;
/// the camera to use to take the screenshot with
[MMEnumCondition("Method", (int)Methods.RenderTexture)]
public Camera TargetCamera;
/// the width of the desired screenshot
[MMEnumCondition("Method", (int)Methods.RenderTexture)]
public int ResolutionWidth;
/// the height of the desired screenshot
[MMEnumCondition("Method", (int)Methods.RenderTexture)]
public int ResolutionHeight;
[Header("Controls")]
/// a test button to take screenshots with
[MMInspectorButton("TakeScreenshot")]
public bool TakeScreenshotButton;
/// <summary>
/// At late update, we look for input
/// </summary>
protected virtual void LateUpdate()
{
DetectInput();
}
/// <summary>
/// If the user presses the screenshot button, we take one
/// </summary>
protected virtual void DetectInput()
{
bool keyPressed = false;
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
keyPressed = Keyboard.current[ScreenshotKey].wasPressedThisFrame;
#else
keyPressed = Input.GetKeyDown(ScreenshotShortcut);
#endif
if (keyPressed)
{
TakeScreenshot();
}
}
/// <summary>
/// Takes a screenshot using the specified method and outputs a console log
/// </summary>
protected virtual void TakeScreenshot()
{
if (!Directory.Exists(FolderName))
{
Directory.CreateDirectory(FolderName);
}
string savePath = "";
switch (Method)
{
case Methods.ScreenCapture:
savePath = TakeScreenCaptureScreenshot();
break;
case Methods.RenderTexture:
savePath = TakeRenderTextureScreenshot();
break;
}
Debug.Log("[MMScreenshot] Screenshot taken and saved at " + savePath);
}
/// <summary>
/// Takes a screenshot using the ScreenCapture API and saves it to file
/// </summary>
/// <returns></returns>
protected virtual string TakeScreenCaptureScreenshot()
{
float width = Screen.width * GameViewSizeMultiplier;
float height = Screen.height * GameViewSizeMultiplier;
string savePath = FolderName+"/screenshot_" + width + "x" + height + "_" + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png";
ScreenCapture.CaptureScreenshot(savePath, GameViewSizeMultiplier);
return savePath;
}
/// <summary>
/// Takes a screenshot using a render texture and saves it to file
/// </summary>
/// <returns></returns>
protected virtual string TakeRenderTextureScreenshot()
{
string savePath = FolderName + "/screenshot_" + ResolutionWidth + "x" + ResolutionHeight + "_" + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png";
RenderTexture renderTexture = new RenderTexture(ResolutionWidth, ResolutionHeight, 24);
TargetCamera.targetTexture = renderTexture;
Texture2D screenShot = new Texture2D(ResolutionWidth, ResolutionHeight, TextureFormat.RGB24, false);
TargetCamera.Render();
RenderTexture.active = renderTexture;
screenShot.ReadPixels(new Rect(0, 0, ResolutionWidth, ResolutionHeight), 0, 0);
TargetCamera.targetTexture = null;
RenderTexture.active = null;
Destroy(renderTexture);
byte[] bytes = screenShot.EncodeToPNG();
System.IO.File.WriteAllBytes(savePath, bytes);
return savePath;
}
}
}