Editor Window截图

时间:2018-02-07 11:49:29

标签: unity3d unity3d-editor unity-editor

我想从自定义的EditorWindow中捕获一个截图,我将其用作我正在处理的游戏的LevelEditor,但我不确定如何操作。

我想要的是捕捉EditorWindow,而不是游戏视图或场景视图。

你能帮帮我吗? 谢谢!

编辑:我想在按GUILayout.Button时按代码截取屏幕截图:)

1 个答案:

答案 0 :(得分:0)

我使用InternalEditorUtility.ReadScreenPixel为此编写了一个脚本。

起初,我实际上是按照您在GUILayout.Button上的要求提供的,但决定在此提供一个更通用的解决方案,该解决方案完全独立于EditorWindow本身。
(无论如何,您仍然可以从EditorScreenshotExtension.Screenshot();呼叫GUILayout.Button。)

我宁愿在ShortCut中添加全局MenuItem,以便您实际上可以为当前处于活动状态(最后点击/重点关注)的{strong>任何截图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的文件夹中,以将其从任何版本中排除。


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

屏幕截图以PNG文件的形式放置在Assets/StreamingAssets中,名称中带有时间戳。

它还将在UniytEditor的顶部菜单中添加一个条目。


当前的快捷方式只是一个随机的方式,到目前为止尚未使用。您可以在MenuItem文档之后在[MenuItem(Screenshot/Take Screenshot %#k)]中进行更改

  

要创建热键,可以使用以下特殊字符:

     
      
  • (在Windows上为 ctrl ,在macOS上为 cmd
  •   
  • shift
  •   
  • alt
  •   
  • 如果不需要特殊的修饰键组合,则可以在下划线后给出该组合键。
  •   
     

例如,使用快捷键shift-alt-g创建菜单,请使用“ MyMenu / Do Something#&g”。要使用快捷键 g 创建菜单并且不按下任何键修饰符,请使用 _ ,例如“ MyMenu / Do Something _g”。

     

支持一些特殊的键盘键作为热键,例如,“#LEFT”将映射为左移。支持的键如下:LEFT,RIGHT,UP,DOWN,F1 .. F12,HOME,END,PGUP,PGDN。

     

热键文本之前必须带有空格字符(“ MyMenu / Do_g”将不被解释为热键,而“ MyMenu / Do _g”将被解释为热键)。


在这里-第一次聚焦于Project视图之后,我第一次简单地按 CTRL + SHIFT + K ;第二次我将焦点放在Inspector上,并使用菜单项拍摄了屏幕截图

enter image description here