· 

【Unity】ScreenShot機能を実装する


Last Updated  2025.12.16

 Unityで、スクリーンショット機能 を実装する方法について紹介します。

 

 というのも、こういった機能はUnity歴に関係なく、開発の初期段階からプロジェクトに組み込んでおく方がいいと感じているからです(記録や動作・描画確認などに役立つため)。

 簡単に実装できる方法ですので、参考になればと思いまとめてみました。

Unity標準のScreenCaptureクラスで実装する方法

▼Unity標準の範囲でスクリーンショット機能を実装するサンプルスクリプト

using UnityEngine;

// スペースキーでスクリーンショットを撮影するシンプルなスクリプト
public class ScreenShotCapturer : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CaptureScreenShot("ScreenShot.png");
        }
    }

    private void CaptureScreenShot(string filePath)
    {
        ScreenCapture.CaptureScreenshot(filePath);
        Debug.Log("ScreenShotを撮影しました");
    }
}

ひとこと解説

  • Input.GetKeyDown(KeyCode.Space):スペースキーが押された瞬間に反応
  • ScreenCapture.CaptureScreenshot(...):指定したファイル名でスクリーンショットを保存

  • Debug.Log(...):撮影完了のログ出力(開発中の確認用)

  • 保存先について:PC (Windows/Mac)で実行した場合、プロジェクトのルートフォルダ(Assetsフォルダと同じ階層)に画像ファイルが保存されます。

 ただし、このままでは 撮影する度に画像を上書きしてしまう のでパシャパシャ(連続撮影)出来ません。

 

 この問題を解決するために、日時や連番をファイル名の末尾に加え、上書きを防止するのが一般的なアプローチですね。

 そのための仕組みを追記し、入力も InputSystemで検知するように改良してみます。(※InputSystemによる追記は後日)

スクリーンショットのファイル名に日時を付ける

private void CaptureScreenShot()
{
    string timestamp = System.DateTime.Now.ToString("yyyyMMdd_HHmmss");
    string filePath = $"ScreenShot_{timestamp}.png";
    ScreenCapture.CaptureScreenshot(filePath);
    Debug.Log("ScreenShotを撮影しました: " + filePath);
}

 このメソッドを、先ほどと同様に入力検知から呼び出すことで、撮影時の日時を含んだファイル名で保存できるようになります。この場合、撮影された画像のファイル名は ScreenShot_20251119_213045.png のように、末尾に「年月日_時分秒」という形で画像が作成される訳ですね。


 変数を新たに用意する必要がなく、シンプルに実装できます。

 日付+時刻をファイル名に含めることで上書きもされず、いつ撮影したものかがひと目でわかるのも利点です。
 そのため、自分は基本的にこちらの方法を採用しています。

【補足】System.DateTime.Now について

 今回使用している DateTime.Now をC#で利用するには、コードの冒頭に using System; というディレクティブが必要です。
 もしこれがない場合は、 System.DateTime.Now というように毎回 System. を頭につけることが必要です。

連番形式にしたい場合(サンプル)

private int shotCount = 0;

private void CaptureScreenShot()
{
    shotCount++;
    string filePath = $"ScreenShot_{shotCount:D3}.png";
    ScreenCapture.CaptureScreenshot(filePath);
    Debug.Log("ScreenShotを撮影しました: " + filePath);
}

Point

  • shotCount という変数をインスタンスフィールドに定義する必要があります
  • D3 は「3桁でゼロ埋め」という意味です(例:001, 002, 003…)
  • これで撮影した場合は ScreenShot_001.png みたいになります。


注意点:

 ただし、この方法では [shotCount] という変数をスクリプト内で管理しているため、テストプレイ(ゲームを再生)するたびにカウントはリセットされてしまいます。また、シーンを再読み込みした場合なども同様です。そのため、撮影した画像は別の場所に移動しておかないと、同じファイル名で上書きされてしまうリスクがあります。

 こうした理由から、自分は日付+時刻形式の方をよく使っていますし、そちらの方が安全でおすすめです。

おわりに

 最後に、自分が気になって調べたことの余談とか

スクリーンショット? スナップショット?

スクリーンショット

 ゲームやアプリの画面をそのまま画像として保存するときに、最も一般的に使われる言葉。

 プレイヤー向けのUIや設定項目でも「スクリーンショットを撮る」が主流。 「スクショ」という略語も定着していて、カジュアルで親しみやすい印象。

スナップショット

 技術的には「ある瞬間の状態を保存する」という意味で、システム全体の状態保存にも使われる。

 ゲーム開発やデータ管理の文脈では、バックアップや状態復元の意味合いで使われることも。
 画面キャプチャとして使う場合もあるが、やや専門的・抽象的な響き。

 こういった「似ているようで違うニュアンスの言葉」は、スクリプト名や変数名として使おうとするときによく悩みます。

 今回の場合、「スクリーンショット」の方がプレイヤーにも開発者にも伝わりやすく、 “画面をそのまま保存する”という意味が機能としても明確だと思ったので、記事にもスクリプトにも採用しました。

 ──が、いちおう参考までに。※せっかく調べたので残しておきます…