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

スクリプトでスクリーンショット撮影 ゲーム開発

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

Unityでスクリーンショットを撮影するための関数

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

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

ScreenCapture-CaptureScreenshot - Unity スクリプトリファレンス
Captures a screenshot and saves it as a .png file to a specified path.

スクリーンショットを撮影するための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. 撮影が完了するまで待つ

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