ScreenshotManager.cs 3.0 KB

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