[Unity] Game View のスクリーンキャプチャを手軽に撮るエディタ拡張

2020-11-20

スクリーンキャプチャをわりとよく撮る

Unity でゲーム開発をしていて、開発中の画面のキャプチャを撮る(スクショする)ことがよくある。 Twitter に上げたりこういう開発ログをサイトに記録したりするときに使う。

最初は普通に Mac 標準のキャプチャ機能(Command + Shift + 5 で起動するやつ)を使っていたのだが、 Game View のサイズにキャプチャ範囲を調整したりとか、 解像度の高いキャプチャをとるために Game View を広げたりするのが面倒になってきた。

Unity 上でスクリプトからキャプチャできないのかなと思って調べるとやり方があったので、 ちょっとしたコードを書いて Unity のメニューから使えるようにした。

スクリプトで Game View のキャプチャを撮る

UnityEngine.ScreenCapture.CaptureScreenshot() という API が用意されているのでそれを使う。

以下のようなコードを書いた:

#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEngine;

namespace AltoLib
{
    public class ScreenCapture
    {
        [MenuItem("Alto/Screen Capture x 1")]
        static void CaptureScreen_x1()
        {
            CaptureScreen(1);
        }

        [MenuItem("Alto/Screen Capture x 2")]
        static void CaptureScreen_x2()
        {
            CaptureScreen(2);
        }

        [MenuItem("Alto/Screen Capture x 3")]
        static void CaptureScreen_x3()
        {
            CaptureScreen(3);
        }

        [MenuItem("Alto/Screen Capture x 4")]
        static void CaptureScreen_x4()
        {
            CaptureScreen(4);
        }

        static void CaptureScreen(int superSize)
        {
            DateTime now = DateTime.Now;
            string timestamp = $"{ now.Year }-{ now.Month.ToString("D2") }{ now.Day.ToString("D2") }-"
                             + $"{ now.Hour.ToString("D2") }{ now.Minute.ToString("D2") }{ now.Second.ToString("D2") }";
            string filePath = $"~/Desktop/{ Application.productName }-{ timestamp }.png";
            UnityEngine.ScreenCapture.CaptureScreenshot(filePath, superSize);
        }
    }
}
#endif

これをプロジェクトの任意の場所に配置すると、メニューの AltoScreen Capture x n から現在の Game View の n 倍の解像度のキャプチャを撮って Desktop/ 以下に保存することができる。