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