Unityエディタ上からGameビューのスクリーンショットを撮るEditor拡張

  • 21
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

Unityで開発していると、Gameビューの画面をそのままスクショして共有したい時があるんですが、標準でその機能が無かったりするのでEditor拡張で書いてみました。
(GitHub Gistにスクリプトファイルがあります → https://gist.github.com/dj-kusuha/a24e17a2d13e37e71214 )

CaptureScreenshotFromEditor.cs
using UnityEditor;
using UnityEngine;

/// <summary>
/// Unityエディタ上からGameビューのスクリーンショットを撮るEditor拡張
/// </summary>
public class CaptureScreenshotFromEditor : Editor {
    /// <summary>
    /// キャプチャを撮る
    /// </summary>
    /// <remarks>
    /// Edit > CaptureScreenshot に追加。
    /// HotKeyは Ctrl + Shift + F12。
    /// </remarks>
    [MenuItem( "Edit/CaptureScreenshot #%F12" )]
    private static void CaptureScreenshot() {
        // 現在時刻からファイル名を決定
        var filename = System.DateTime.Now.ToString( "yyyyMMdd-HHmmss" ) + ".png";
        // キャプチャを撮る
        Application.CaptureScreenshot( filename ); // ← GameViewにフォーカスがない場合、この時点では撮られない
        // GameViewを取得してくる
        var assembly = typeof( UnityEditor.EditorWindow ).Assembly;
        var type = assembly.GetType( "UnityEditor.GameView" );
        var gameview = EditorWindow.GetWindow( type );
        // GameViewを再描画
        gameview.Repaint();

        Debug.Log( "ScreenShot: " + filename );
    }
}

なんかあっさり書けたな?

やってることは普段良く使われている(はずの) Application.CaptureScreenshot が全てですが、それ以降にGameビューを再描画する処理を書いています。
なんでこんなものがあるのかと言いますと、 Application.CaptureScreenshot を呼んだだけではスクショのファイルが保存されなかったんですが、Gameビューが再描画された時(フォーカス合わせたりとか)に保存されていたので、スクリプトから強制的に再描画させるために追加してあります。

ちなみに MenuItem#%F12 と指定することで Ctrl + Shift + F12CaptureScreenshot が呼ばれるようになります。
このあたりは 公式リファレンス をどうぞ。


参考: