ScreenshotManager.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using BepInEx;
  2. using BepInEx.Common;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using UnityEngine;
  9. namespace Screencap
  10. {
  11. public class ScreenshotManager : BaseUnityPlugin
  12. {
  13. public override string Name => "Screenshot Manager";
  14. private string screenshotDir = Utility.CombinePaths(Utility.ExecutingDirectory, "UserData", "cap");
  15. public ScreenshotManager()
  16. {
  17. if (!Directory.Exists(screenshotDir))
  18. Directory.CreateDirectory(screenshotDir);
  19. }
  20. void LateUpdate()
  21. {
  22. if (UnityEngine.Event.current.Equals(Event.KeyboardEvent("f9")))
  23. {
  24. string filename = Path.Combine(screenshotDir, $"Koikatsu -{DateTime.Now.ToString("yyyy-mm-dd-HH-mm-ss")}.png");
  25. TakeScreenshot(filename);
  26. }
  27. else if (UnityEngine.Event.current.Equals(Event.KeyboardEvent("f11")))
  28. {
  29. string filename = Path.Combine(screenshotDir, $"Koikatsu Char-{DateTime.Now.ToString("yyyy-mm-dd-HH-mm-ss")}.png");
  30. TakeCharScreenshot(filename);
  31. }
  32. }
  33. void TakeScreenshot(string filename)
  34. {
  35. UnityEngine.Application.CaptureScreenshot(filename);
  36. Console.WriteLine($"Screenshot saved to {filename}");
  37. }
  38. void TakeCharScreenshot(string filename)
  39. {
  40. Camera.main.backgroundColor = Color.clear;
  41. var tex = RenderCamera(Camera.main);
  42. File.WriteAllBytes(filename, tex.EncodeToPNG());
  43. Destroy(tex);
  44. Console.WriteLine($"Character screenshot saved to {filename}");
  45. }
  46. Texture2D RenderCamera(Camera cam)
  47. {
  48. var go = new GameObject();
  49. Camera renderCam = go.AddComponent<Camera>();
  50. renderCam.CopyFrom(Camera.main);
  51. renderCam.targetTexture = new RenderTexture(2048, 2048, 32); //((int)cam.pixelRect.width, (int)cam.pixelRect.height, 32);
  52. renderCam.aspect = renderCam.targetTexture.width / (float)renderCam.targetTexture.height;
  53. RenderTexture currentRT = RenderTexture.active;
  54. RenderTexture.active = renderCam.targetTexture;
  55. renderCam.Render();
  56. Texture2D image = new Texture2D(renderCam.targetTexture.width, renderCam.targetTexture.height);
  57. image.ReadPixels(new Rect(0, 0, renderCam.targetTexture.width, renderCam.targetTexture.height), 0, 0);
  58. image.Apply();
  59. RenderTexture.active = currentRT;
  60. Destroy(renderCam.targetTexture);
  61. Destroy(renderCam);
  62. return image;
  63. }
  64. }
  65. }