编辑器窗口截图

问题描述 投票:2回答:1

我想捕捉从我使用的是作为一个游戏我工作的一个关卡编辑器定制EditorWindow的截图,但我不知道如何做到这一点。

我要的是捕捉EditorWindow,而不是游戏视图或现场查看。

你能帮助我吗?谢谢!

编辑:我想借此通过代码,按下一个GUILayout.Button时的截图:)

unity3d unity3d-editor unity-editor
1个回答
0
投票

我做了一个脚本这一点使用InternalEditorUtility.ReadScreenPixel

起初,我其实是有它作为你的要求在GUILayout.Button但决定,而不是提供一个在这里更普遍的解决方案,它是从EditorWindow本身完全独立的。 (你仍然反正从EditorScreenshotExtension.Screenshot();调用GUILayout.Button。)

我宁愿加入一家全球MenuItem与快捷方式,你实际上可以采取任何当前活动的截图(上次单击/聚焦)EditorWindow

EditorScreenshotExtension.cs

using System.IO;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

public static class EditorScreenshotExtension
{
    [MenuItem("Screenshot/Take Screenshot %#k")]
    private static void Screenshot()
    {
        // Get actvive EditorWindow
        var activeWindow = EditorWindow.focusedWindow;

        // Get screen position and sizes
        var vec2Position = activeWindow.position.position;
        var sizeX = activeWindow.position.width;
        var sizeY = activeWindow.position.height;

        // Take Screenshot at given position sizes
        var colors = InternalEditorUtility.ReadScreenPixel(vec2Position, (int)sizeX, (int)sizeY);

        // write result Color[] data into a temporal Texture2D
        var result = new Texture2D((int)sizeX, (int)sizeY);
        result.SetPixels(colors);

        // encode the Texture2D to a PNG
        // you might want to change this to JPG for way less file size but slightly worse quality
        // if you do don't forget to also change the file extension below
        var bytes = result.EncodeToPNG();

        // In order to avoid bloading Texture2D into memory destroy it
        Object.DestroyImmediate(result);

        // finally write the file e.g. to the StreamingAssets folder
        var timestamp = System.DateTime.Now;
        var stampString = string.Format("_{0}-{1:00}-{2:00}_{3:00}-{4:00}-{5:00}", timestamp.Year, timestamp.Month, timestamp.Day, timestamp.Hour, timestamp.Minute, timestamp.Second);
        File.WriteAllBytes(Path.Combine(Application.streamingAssetsPath, "Screenshot" + stampString + ".png"), bytes);

        // Refresh the AssetsDatabase so the file actually appears in Unity
        AssetDatabase.Refresh();

        Debug.Log("New Screenshot taken");
    }
}

由于它使用UnityEditorUnityEditorInternal确保将其放在一个名为Editor文件夹中exlude从任何作品。


它导入到项目后,只需使用CTRL + SHIFT + K创建当前活动EditorWindow的屏幕截图。

截图放在为PNG文件中Assets/StreamingAssets在名称中的时间戳。

这也将增加UniytEditor的顶级菜单项。


当前的快捷方式只是未使用至今的随机一个。你可以在[MenuItem(Screenshot/Take Screenshot %#k)]MenuItem文档更改

要创建您可以使用下面的特殊字符的热键:

  • %(在Windows上按Ctrl,在cmd在MacOS)
  • #(移位)
  • &(所有)
  • 如果不需要特殊的组合键键能下划线后给出。

例如,要创建一个快捷键Shift + Alt键-G使用菜单“的MyMenu /做点什么#&G”。要创建热键克菜单内没有任何按键按下修饰符使用_象“的MyMenu /做点什么_g”。

一些特殊的键盘键也支持快捷键,例如“#LEFT”将映射到左移位。支持这样的关键是:左,右,上,下,F1 ... F12,HOME,END,PGUP,PGDN。

热键文本必须用空格字符开头(“MyMenu菜单/ Do_g”将不被解释为热键,而“为MyMenu / DO _g”会)。


在这里,在行动 - 我第一次只需按下CTRL + SHIFT + K具有聚焦最后Project视图后;我第二次集中Inspector并使用菜单项采取截图

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.