Unity截图生成图片 图片生成器 一键生成图片

使用Unity编辑器扩展技术实现快速截图功能

效果:

里面没有什么太难的技术,直接上源码吧

  • 注意!代码需要放在Editor文件下才能正常运行
using System;
using UnityEditor;
using UnityEngine;

[ExecuteInEditMode]
public class Screenshot : EditorWindow
{
    int MaxShowSelectGo = 5;//最多显示选中的物体

    int resWidth = Screen.width * 4;
	int resHeight = Screen.height * 4;
    
	public Camera myCamera;
	int scale = 1;
    float delayCreateTime = 0.5f;
	string path = "";
	bool showPreview = true;
	RenderTexture renderTexture;
	GameObject[] selectGOs;
	bool isTransparent = true;
	bool isCaptureMultiple = false;
    // Add menu item named "My Window" to the Window menu
    [MenuItem("Tools/图片生成器")]
	public static void ShowWindow()
	{
		//Show existing window instance. If one doesn't exist, make one.
		EditorWindow editorWindow = EditorWindow.GetWindow(typeof(Screenshot));
		editorWindow.autoRepaintOnSceneChange = true;
		editorWindow.Show();
		editorWindow.title = "图片生成器";
	}

	float lastTime;


	void OnGUI()
	{
		EditorGUILayout.LabelField("分辨率", EditorStyles.boldLabel);
		resWidth = EditorGUILayout.IntField("宽", resWidth);
		resHeight = EditorGUILayout.IntField("高", resHeight);

        EditorGUILayout.Space();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("默认设置", EditorStyles.boldLabel);
        if (GUILayout.Button("使用Game视图的分辨率"))
        {
            resHeight = (int)Handles.GetMainGameViewSize().y;
            resWidth = (int)Handles.GetMainGameViewSize().x;

        }

        if (GUILayout.Button("使用默认大小。H:1440,W:2560"))
        {
            resHeight = 1440;
            resWidth = 2560;
            scale = 1;
        }
        EditorGUILayout.EndHorizontal();
        
        EditorGUILayout.Space();

		scale = EditorGUILayout.IntSlider("尺寸", scale, 1, 15);

		EditorGUILayout.HelpBox("截图的默认模式是裁剪,所以选择合适的宽度和高度。比例是在不损失质量的情况下倍增或放大渲染的一个因素.", MessageType.None);
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("截图分辨率为 " + resWidth * scale + " x " + resHeight * scale + " p", EditorStyles.boldLabel);

        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("选择相机", EditorStyles.boldLabel);
		myCamera = EditorGUILayout.ObjectField(myCamera, typeof(Camera), true, null) as Camera;
		if (myCamera == null) myCamera = Camera.main;
		if (myCamera != null) myCamera.clearFlags = CameraClearFlags.SolidColor;

        isTransparent = EditorGUILayout.Toggle("透明背景", isTransparent);
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.HelpBox("选择要捕捉渲染的相机。勾选则背景透明", MessageType.None);

        EditorGUILayout.Space();

        isCaptureMultiple = EditorGUILayout.Toggle("一次性捕捉多个物体", isCaptureMultiple);
		if (isCaptureMultiple)
		{
            selectGOs = Selection.gameObjects;
            GUILayout.Label((selectGOs.Length == 0 ? "你还什么都没有选。使用鼠标选中场景中的物体,用Shift或者Ctrl多选。" : "当前选择物体数量:"+ selectGOs.Length), EditorStyles.boldLabel);
            int ShowSelectGo = 0;
            foreach (var item in selectGOs)
			{
                if (ShowSelectGo>=MaxShowSelectGo&& MaxShowSelectGo < selectGOs.Length)
                {
                    GUILayout.Label("......", EditorStyles.boldLabel);
                    break;
                }
                GUILayout.Label(item.name, EditorStyles.boldLabel);
                ShowSelectGo++;
            }
        }

        EditorGUILayout.Space();

        GUILayout.Label("保存路径", EditorStyles.boldLabel);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.TextField(path, GUILayout.ExpandWidth(false));
        if (GUILayout.Button("选择路径", GUILayout.ExpandWidth(false)))
            path = EditorUtility.SaveFolderPanel("保存图片的路径", path, Application.dataPath);

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.HelpBox("选择保存屏幕截图的文件夹", MessageType.None);
        EditorGUILayout.Space();

        delayCreateTime = EditorGUILayout.Slider("延时生成时间", delayCreateTime, 0.5f, 5);
        EditorGUILayout.HelpBox("请注意!时间越短,生成图片出错的概率就越高。建议调整为1", MessageType.None);
        if (GUILayout.Button("生成", GUILayout.MinHeight(60)))
		{
			if (path == "") path = EditorUtility.SaveFolderPanel("保存图片的路径", path, Application.dataPath);
			if (isCaptureMultiple)
			{
                StartTakeHiResShot();
            }
			else
			{
                TakeHiResShot();
                Application.OpenURL("file://" + path);
            }
            
        }

		EditorGUILayout.Space();
		EditorGUILayout.BeginHorizontal();

		if (GUILayout.Button("打开最后一个截图", GUILayout.MaxWidth(160), GUILayout.MinHeight(40)))
		{
			if (lastScreenshot != "")
			{
				Application.OpenURL("file://" + lastScreenshot);
				Debug.Log("Opening File " + lastScreenshot);
			}
		}

		if (GUILayout.Button("打开截图文件夹", GUILayout.MaxWidth(100), GUILayout.MinHeight(40)))
		{
			Application.OpenURL("file://" + path);
		}
		EditorGUILayout.EndHorizontal();
	}
    GameObject go = null;
    void StartTakeHiResShot()
	{
        if (selectGOs.Length==0)
        {
            EditorUtility.DisplayDialog("提示", "请注意!你没有选择任何物体,这不会生成图片。\n\n请取消勾选'一次性捕捉多个物体'这个选项生成单张图片.", "确定");
            return;
        }
        foreach (var item in selectGOs)
        {
            item.SetActive(false);
        }
        go = null;
        Take(0,0);
        //Take(0);
    }
    void Take(int index,float delayTime)
    {
        if (index < selectGOs.Length)
        {
            if (go != null) go.SetActive(false);
            selectGOs[index].SetActive(true);
            go = selectGOs[index];
            if (delayTime > delayCreateTime)
            {
                delayTime = 0;
                TakeHiResShot();
                index++;
            }
            EditorApplication.delayCall += () => { Take(index, delayTime + 0.1f); };
        }
        else
        {
            Application.OpenURL("file://" + path);
        }
    }
    void Take(int index)
    {
        if (index < selectGOs.Length)
        {
            if (go != null) go.SetActive(false);
            selectGOs[index].SetActive(true);
            go = selectGOs[index];
            //EditorApplication.delayCall += () =>
            //{
            //    TakeHiResShot(() => { Take(index + 1); });
            //};
            TakeHiResShot(() =>
            {
                Take(index + 1);
            });
        }
        else
        {
            Application.OpenURL("file://" + path);
        }
    }

    //private bool takeHiResShot = false;
    public string lastScreenshot = "";


	public string ScreenShotName(int width, int height)
	{

		string strPath = "";

		strPath = string.Format("{0}/screen_{1}x{2}_{3}.png",
							 path,
							 width, height,
									   System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));
		lastScreenshot = strPath;

		return strPath;
	}


    public void TakeHiResShot(Action Callback= null)
	{
		Debug.Log("采取截图");
        int resWidthN = resWidth * scale;
        int resHeightN = resHeight * scale;
        RenderTexture rt = new RenderTexture(resWidthN, resHeightN, 24);
        myCamera.targetTexture = rt;

        TextureFormat tFormat;
        if (isTransparent)
            tFormat = TextureFormat.ARGB32;
        else
            tFormat = TextureFormat.RGB24;


        Texture2D screenShot = new Texture2D(resWidthN, resHeightN, tFormat, false);
        myCamera.Render();
        RenderTexture.active = rt;
        screenShot.ReadPixels(new Rect(0, 0, resWidthN, resHeightN), 0, 0);
        myCamera.targetTexture = null;
        RenderTexture.active = null;
        byte[] bytes = screenShot.EncodeToPNG();
        string filename = ScreenShotName(resWidthN, resHeightN);

        System.IO.File.WriteAllBytes(filename, bytes);
        Debug.Log(string.Format("截图如下: {0}", filename));
        //Application.OpenURL(filename);
        Callback?.Invoke();
    }
}

点击下载Demo

你可能感兴趣的:(Unity插件,unity,游戏引擎,编辑器)