ScreenshotManager.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. float oldaspect = cam.aspect;
  49. cam.targetTexture = new RenderTexture(1024, 1024, 32); //((int)cam.pixelRect.width, (int)cam.pixelRect.height, 32);
  50. cam.aspect = cam.targetTexture.width / (float)cam.targetTexture.height;
  51. RenderTexture currentRT = RenderTexture.active;
  52. RenderTexture.active = cam.targetTexture;
  53. cam.Render();
  54. Texture2D image = new Texture2D(cam.targetTexture.width, cam.targetTexture.height);
  55. image.ReadPixels(new Rect(0, 0, cam.targetTexture.width, cam.targetTexture.height), 0, 0);
  56. image.Apply();
  57. RenderTexture.active = currentRT;
  58. Destroy(cam.targetTexture);
  59. cam.targetTexture = null;
  60. cam.aspect = oldaspect;
  61. return image;
  62. }
  63. }
  64. }