C#
Unity

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

2018/08/23追記

気づいたら Application.ScreenShot が使えなくなっていたので ScreenCapture.ScreenShot に変更しました。 Unity 2018.2.5f1 で動作確認。
困っている方 がいらしたのに気づかず申し訳ない。。


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

CaptureScreenshotFromEditor.cs
using UnityEditor;
using UnityEngine;

namespace djkusuha.Utility
{
    /// <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";
            // キャプチャを撮る
#if UNITY_2017_1_OR_NEWER
            ScreenCapture.CaptureScreenshot(filename); // ← GameViewにフォーカスがない場合、この時点では撮られない
#else
            Application.CaptureScreenshot(filename); // ← GameViewにフォーカスがない場合、この時点では撮られない
#endif
            // GameViewを取得してくる
            var assembly = typeof(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 が呼ばれるようになります。
このあたりは 公式リファレンス をどうぞ。


参考: