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

134 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}