【Unity】スクリプトからゲーム画面のスクリーンショットを撮影する方法

スクリプトでスクリーンショット撮影 ゲーム制作メモ

Unityでゲームを作っていると、ゲーム画面を撮影する「スクリーンショット機能」をつけたくなることがありますよね。そこでここではC#スクリプトからスクリーンショットを撮影する方法について説明します。

スポンサーリンク

Unityでスクリーンショットを撮影するためのメソッド

Unityでスクリプトからスクリーンショットを撮影するには、「ScreenCapture.CaptureScreenshot」メソッドを使います。

詳細は公式リファレンスをご覧ください。

ScreenCapture-CaptureScreenshot - Unity スクリプトリファレンス
PNG ファイルとして filename のパスでスクリーンショットを撮ります。

スクリーンショットを撮影するためのC#スクリプト

ではスクリーンショットを撮影するためのC#スクリプトを掲載します(※利用規約に従ってご利用ください)。

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class Screenshot : MonoBehaviour
{

    [Header("保存先の設定")]
    [SerializeField]
    string folderName = "Screenshots";

    bool isCreatingScreenShot = false;
    string path;
    SoundManager soundManager;

    void Start()
    {
        path = Application.dataPath + "/" + folderName + "/";
    }

    public void PrintScreen()
    {
        StartCoroutine("PrintScreenInternal");
    }

    IEnumerator PrintScreenInternal()
    {
        if (isCreatingScreenShot)
        {
            yield break;
        }

        isCreatingScreenShot = true;

        yield return null;

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        string date = DateTime.Now.ToString("yy-MM-dd_HH-mm-ss");
        string fileName = path + date + ".png";

        ScreenCapture.CaptureScreenshot(fileName);

        yield return new WaitUntil(() => File.Exists(fileName));

        isCreatingScreenShot = false;
    }

}

使い方

uGUIのボタンや外部のスクリプトから「PrintScreen」メソッドを呼び出してください。

スクリプトの解説

画像ファイルの保存先について

まず保存先のファイルパスについてですが、Unityではプラットフォームによって保存先が異なるため「Application.dataPath」を使います。こうすることで自動的に対象のプラットフォームに合った保存先を指定することが可能です。

PrintScreenInternalコルーチンの処理の流れ

次にPrintScreenInternalコルーチンではスクリーンショットの作成&保存処理を行っています。処理の流れとしては次のような感じになっています。

  1. 保存先のフォルダがなければ新しく作る
  2. スクリーンショットを撮影する
  3. 撮影が完了するまで待つ

この処理の流れでコルーチンを使う理由は、スクリーンショット画像ファイルの作成や保存には時間がかかる可能性があるからです。コルーチンを使うことで処理が完了するまで新しい呼び出しを受け付けないようにできるのでより安全です。