NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/ScreenshotManager.cs

134 lines
4.3 KiB
C#
Raw Normal View History

2025-12-25 15:01:35 +08:00
using System;
using Framework;
using PhxhSDK;
using UnityEngine;
using Constants = Framework.Constants;
/// <summary>
/// 截图管理器
/// 负责管理游戏内的模糊截图功能用于UI背景等
/// </summary>
public class ScreenshotManager
{
#region Singleton
private static ScreenshotManager _instance;
public static ScreenshotManager Instance
{
get
{
if (_instance == null)
{
_instance = new ScreenshotManager();
}
return _instance;
}
}
private ScreenshotManager() { }
#endregion
private const string SCREEN_SNAPSHOT = "ScreenSnapshot";
private RenderTexture _screenTexture;
/// <summary>
/// 截取当前屏幕并应用模糊效果
/// </summary>
/// <param name="captureUI">是否截取UI相机内容默认truefalse则截取主相机</param>
public void CaptureScreenshot(bool captureUI = true)
{
try
{
//int width = PerformanceManager.instance.ScreenSize.x / 2;
//int height = PerformanceManager.instance.ScreenSize.y / 2;
int width = Screen.width / 2;
int height = Screen.height / 2;
// 创建或更新 RenderTexture
if (null == _screenTexture)
{
_screenTexture = RenderTexturePool.Instance.Create(SCREEN_SNAPSHOT, width, height, RenderTexturePool.DEFAULT_DEPTH);
_screenTexture.filterMode = FilterMode.Trilinear;
}
else if (_screenTexture.width != width || _screenTexture.height != height)
{
RenderTexturePool.Instance.Destroy(_screenTexture, true);
_screenTexture = RenderTexturePool.Instance.Create(SCREEN_SNAPSHOT, width, height, RenderTexturePool.DEFAULT_DEPTH);
_screenTexture.filterMode = FilterMode.Trilinear;
}
CameraManager.Instance.SetMainCameraActive(false);
// 渲染截图
Camera usingCamera = captureUI ? CameraManager.Instance.UICamera : CameraManager.Instance.MainCamera;
if (usingCamera != null)
{
Rect rect = usingCamera.rect;
usingCamera.rect = new Rect(0f, 0f, 1f, 1f);
usingCamera.targetTexture = _screenTexture;
usingCamera.Render();
usingCamera.targetTexture = captureUI ? null : CameraManager.Instance.DefaultRenderTarget;
usingCamera.rect = rect;
}
else
{
DebugUtil.LogError("ScreenshotManager: usingCamera is null");
}
// 高斯模糊处理
ApplyGaussianBlur();
}
catch (Exception e)
{
DebugUtil.LogError($"ScreenshotManager.CaptureScreenshot error: {e}");
}
}
/// <summary>
/// 应用高斯模糊效果
/// </summary>
private void ApplyGaussianBlur()
{
var material = AssetManager.Instance.GetPreLoadResult<Material>(Constants.BLUR_MAT_PATH);
if (material == null)
{
DebugUtil.LogError("ScreenshotManager: Blur material not found");
return;
}
// 需要用一个缓存的rt,不然移动平台会出现方块
RenderTexture cacheRt = CameraManager.Instance.DefaultRenderTarget;
Graphics.Blit(_screenTexture, cacheRt, material);
Graphics.Blit(cacheRt, _screenTexture);
}
/// <summary>
/// 重置截图状态(恢复主相机)
/// </summary>
public void ResetScreenshot()
{
CameraManager.Instance.SetMainCameraActive(true);
}
/// <summary>
/// 获取截图的 Texture2D
/// </summary>
public Texture2D GetScreenTexture2D()
{
if (_screenTexture == null)
{
DebugUtil.LogWarning("ScreenshotManager: No screenshot available");
return null;
}
Texture2D texture2D = PhxhSDK.Utils.CreateTexture2D(_screenTexture.name, _screenTexture.width, _screenTexture.height);
RenderTexture.active = _screenTexture;
texture2D.ReadPixels(new Rect(0f, 0f, _screenTexture.width, _screenTexture.height), 0, 0);
texture2D.Apply();
RenderTexture.active = null;
return texture2D;
}
}