134 lines
4.3 KiB
C#
134 lines
4.3 KiB
C#
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相机内容(默认true),false则截取主相机</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;
|
||
}
|
||
}
|