using System;
using UnityEngine;
namespace WulaFallenEmpire.EventSystem.AI
{
///
/// Unity 屏幕截取工具类,用于 VLM 视觉分析
///
public static class ScreenCaptureUtility
{
private const int MaxImageSize = 1024; // 限制图片大小以节省 API 费用
///
/// 截取当前屏幕并返回 Base64 编码的 PNG
///
public static string CaptureScreenAsBase64()
{
try
{
// 使用 Unity 截屏
Texture2D screenshot = ScreenCapture.CaptureScreenshotAsTexture();
if (screenshot == null)
{
WulaLog.Debug("[ScreenCapture] CaptureScreenshotAsTexture returned null");
return null;
}
// 缩放以适配 API 限制
Texture2D resized = ResizeTexture(screenshot, MaxImageSize);
// 编码为 PNG
byte[] pngBytes = resized.EncodeToPNG();
// 清理资源
UnityEngine.Object.Destroy(screenshot);
if (resized != screenshot)
{
UnityEngine.Object.Destroy(resized);
}
WulaLog.Debug($"[ScreenCapture] Captured {pngBytes.Length} bytes");
return Convert.ToBase64String(pngBytes);
}
catch (Exception ex)
{
WulaLog.Debug($"[ScreenCapture] Failed: {ex.Message}");
return null;
}
}
///
/// 缩放纹理到指定最大尺寸
///
private static Texture2D ResizeTexture(Texture2D source, int maxSize)
{
int width = source.width;
int height = source.height;
// 计算缩放比例
if (width <= maxSize && height <= maxSize)
{
return source; // 无需缩放
}
float ratio = (float)maxSize / Mathf.Max(width, height);
int newWidth = Mathf.RoundToInt(width * ratio);
int newHeight = Mathf.RoundToInt(height * ratio);
// 创建缩放后的纹理
RenderTexture rt = RenderTexture.GetTemporary(newWidth, newHeight);
Graphics.Blit(source, rt);
RenderTexture previous = RenderTexture.active;
RenderTexture.active = rt;
Texture2D resized = new Texture2D(newWidth, newHeight, TextureFormat.RGB24, false);
resized.ReadPixels(new Rect(0, 0, newWidth, newHeight), 0, 0);
resized.Apply();
RenderTexture.active = previous;
RenderTexture.ReleaseTemporary(rt);
WulaLog.Debug($"[ScreenCapture] Resized from {width}x{height} to {newWidth}x{newHeight}");
return resized;
}
}
}