[unity 2020以降]キャラだけで背景ヌキのスクリーンショットを撮りたい

unity ではキャラだけで背景をヌキにしたスクリーンショットを簡単に撮る事ができます。
(unity2020 以降と書きましたが、多分それ以前でも動作すると思います)

やり方

Camera は Skybox ではなく SolidColor にして、Background のα値を 0 にします。
次に、以下のコードを適当な GameObject に貼り付けてください。

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

public class AlphaScreenShot : MonoBehaviour
{
    const string SCREENSHOT_DIRECTORY = "Assets/ScreenShots/";

    void Start()
    {
        if (Directory.Exists(SCREENSHOT_DIRECTORY) == false)
        {
            Directory.CreateDirectory(SCREENSHOT_DIRECTORY);
        }
        StartCoroutine(loop());
    }

    IEnumerator loop()
    {
        while (true)
        {
            if (Input.anyKeyDown == false)
            {
                yield return null;
                continue;
            }

            // これがないと failed to generate texture エラー
            yield return new WaitForEndOfFrame();

            var filename = $"{DateTime.Now.ToString().Replace('/', '-').Replace(':', '-')}.png";
            var filepath = Path.Combine(SCREENSHOT_DIRECTORY, filename);

            var texAlpha = new Texture2D(Screen.width, Screen.height, TextureFormat.ARGB32, false);
            texAlpha.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            texAlpha.Apply();

            // Encode texture into PNG
            var bytes = texAlpha.EncodeToPNG();
            File.WriteAllBytes(filepath, bytes);

            Destroy(texAlpha);
        }
    }
}

他の記事で OnPostRender が必要というものも見受けられますが、WaitForEndOfFrame() でも同じタイミングを捕らえるので、Camera オブジェクトである必要はありません。

Game ウィンドウ内で何かキーを押す度に現在のスクリーンを Assets/ScreenShots/ に保存します。

なお、背景ありでよければコード1行だけでOKです。

ScreenCapture.CaptureScreenshot(filepath);

返信を残す

メールアドレスが公開されることはありません。

CAPTCHA