82 lines
2.6 KiB
C#
82 lines
2.6 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
|
||
/// <summary>
|
||
/// pass
|
||
/// </summary>
|
||
public class UIToTextureExporter : MonoBehaviour
|
||
{
|
||
public RectTransform targetUIRoot;
|
||
public Vector2Int outputResolution = new Vector2Int(1024, 1024);
|
||
public string fileName = "UIRender";
|
||
public string saveFolder = "Exports";
|
||
|
||
[ContextMenu("导出 UI 图像")]
|
||
public void ExportUI()
|
||
{
|
||
if (targetUIRoot == null)
|
||
{
|
||
Debug.LogError("请指定 UI 根节点!");
|
||
return;
|
||
}
|
||
|
||
// 创建RenderTexture
|
||
RenderTexture rt = new RenderTexture(outputResolution.x, outputResolution.y, 24);
|
||
RenderTexture.active = rt;
|
||
|
||
// 清空背景
|
||
GL.Clear(true, true, new Color(0, 0, 0, 0));
|
||
|
||
// 创建一个临时Canvas进行渲染
|
||
GameObject tempCanvasGO = new GameObject("TempCanvas", typeof(Canvas));
|
||
Canvas tempCanvas = tempCanvasGO.GetComponent<Canvas>();
|
||
tempCanvas.renderMode = RenderMode.WorldSpace;
|
||
tempCanvas.pixelPerfect = true;
|
||
|
||
RectTransform canvasRT = tempCanvas.GetComponent<RectTransform>();
|
||
canvasRT.sizeDelta = outputResolution;
|
||
|
||
// 拷贝所有 Graphic 元素
|
||
List<Graphic> graphics = new List<Graphic>();
|
||
targetUIRoot.GetComponentsInChildren(true, graphics);
|
||
|
||
foreach (var graphic in graphics)
|
||
{
|
||
if (!graphic.gameObject.activeInHierarchy) continue;
|
||
|
||
var clone = Instantiate(graphic, tempCanvas.transform);
|
||
var rect = clone.rectTransform;
|
||
|
||
// 保持位置、尺寸
|
||
rect.sizeDelta = graphic.rectTransform.rect.size;
|
||
rect.anchoredPosition = graphic.rectTransform.anchoredPosition;
|
||
rect.localScale = graphic.rectTransform.localScale;
|
||
}
|
||
|
||
// 强制渲染一次
|
||
Canvas.ForceUpdateCanvases();
|
||
|
||
// 生成截图
|
||
Texture2D result = new Texture2D(outputResolution.x, outputResolution.y, TextureFormat.ARGB32, false);
|
||
result.ReadPixels(new Rect(0, 0, outputResolution.x, outputResolution.y), 0, 0);
|
||
result.Apply();
|
||
|
||
// 保存
|
||
string dirPath = Path.Combine(Application.dataPath, saveFolder);
|
||
Directory.CreateDirectory(dirPath);
|
||
string path = Path.Combine(dirPath, fileName + ".png");
|
||
|
||
File.WriteAllBytes(path, result.EncodeToPNG());
|
||
Debug.Log($"✅ UI导出成功:{path}");
|
||
|
||
// 清理
|
||
DestroyImmediate(result);
|
||
DestroyImmediate(tempCanvasGO);
|
||
RenderTexture.active = null;
|
||
rt.Release();
|
||
DestroyImmediate(rt);
|
||
}
|
||
}
|