ScreenshotManager.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. Event ScreenKeyEvent;
  15. Event CharacterKeyEvent;
  16. private string screenshotDir = Utility.CombinePaths(Utility.ExecutingDirectory, "UserData", "cap");
  17. public ScreenshotManager()
  18. {
  19. ScreenKeyEvent = Event.KeyboardEvent("f9");
  20. CharacterKeyEvent = Event.KeyboardEvent("f11");
  21. if (!Directory.Exists(screenshotDir))
  22. Directory.CreateDirectory(screenshotDir);
  23. }
  24. void LateUpdate()
  25. {
  26. if (UnityEngine.Event.current.Equals(ScreenKeyEvent))
  27. {
  28. string filename = Path.Combine(screenshotDir, $"Koikatsu -{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.png");
  29. TakeScreenshot(filename);
  30. }
  31. else if (UnityEngine.Event.current.Equals(CharacterKeyEvent))
  32. {
  33. string filename = Path.Combine(screenshotDir, $"Koikatsu Char-{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.png");
  34. TakeCharScreenshot(filename);
  35. }
  36. }
  37. void TakeScreenshot(string filename)
  38. {
  39. UnityEngine.Application.CaptureScreenshot(filename);
  40. Console.WriteLine($"Screenshot saved to {filename}");
  41. }
  42. void TakeCharScreenshot(string filename)
  43. {
  44. Camera.main.backgroundColor = Color.clear;
  45. var tex = RenderCamera(Camera.main);
  46. File.WriteAllBytes(filename, tex.EncodeToPNG());
  47. Destroy(tex);
  48. Console.WriteLine($"Character screenshot saved to {filename}");
  49. }
  50. Texture2D RenderCamera(Camera cam)
  51. {
  52. var go = new GameObject();
  53. Camera renderCam = go.AddComponent<Camera>();
  54. renderCam.CopyFrom(Camera.main);
  55. renderCam.targetTexture = new RenderTexture(2048, 2048, 32); //((int)cam.pixelRect.width, (int)cam.pixelRect.height, 32);
  56. renderCam.aspect = renderCam.targetTexture.width / (float)renderCam.targetTexture.height;
  57. RenderTexture currentRT = RenderTexture.active;
  58. RenderTexture.active = renderCam.targetTexture;
  59. renderCam.Render();
  60. Texture2D image = new Texture2D(renderCam.targetTexture.width, renderCam.targetTexture.height);
  61. image.ReadPixels(new Rect(0, 0, renderCam.targetTexture.width, renderCam.targetTexture.height), 0, 0);
  62. image.Apply();
  63. RenderTexture.active = currentRT;
  64. Destroy(renderCam.targetTexture);
  65. Destroy(renderCam);
  66. return image;
  67. }
  68. }
  69. }