強火で進め

このブログではプログラム関連の記事を中心に書いてます。

ゲーム画面のスクリーンキャプチャを行う方法(アルファチャンネルも含める)

Application.CaptureScreenshot() でスクリーンキャプチャを行った場合はアルファチャンネルが反映されません。アルファチャンネルも含めてキャプチャする為には少々手間が必要です。

ゲーム画面のアルファチャンネルの設定

そもそも、ゲーム画面のアルファチャンネルについてはカメラのBackgroundにて設定します。

ここで A のパラメータをこの様に 0 に設定すると完全に透過する様になります。

しかし、一度設定した後にもう一度この設定パネルを開くと A の値が 255 に成ってしまうバグが有ります。

このバグはあくまで見た目だけの様です。そのため、ちゃんと 0 の設定した後に 255 に成っていたとしても内部的には反映されているので気にしないで大丈夫です。

アルファチャンネル付きでキャプチャを行う

さて、メインのキャプチャ処理について解説します。今回のサンプルは以下のページのサンプルを元に作成しました。

Unity Script Reference – Texture2D.EncodeToPNG
http://unity3d.com/support/documentation/ScriptReference/Texture2D.EncodeToPNG.html

このサンプルは適当なGameObjectを作成し、張り付けると使えます。
ゲーム開始時にキャプチャが実行されます。
※このサンプルはビルド時のPlatformの設定がWeb Playerの場合には動作しません。「PC and Mac Standalone」などを選択して試して下さい。

【Capture.js】

import System.IO;

function Start () {
	Capture("capture.png");
}

function Capture (filePath : String) {
	// We should only read the screen bufferafter rendering is complete
	yield WaitForEndOfFrame();
	
	var width = Screen.width;
	var height = Screen.height;
	var tex = new Texture2D (width, height, TextureFormat.ARGB32, false);
	// Read screen contents into the texture
	tex.ReadPixels (Rect(0, 0, width, height), 0, 0);
	tex.Apply ();

	// Encode texture into PNG
	var bytes = tex.EncodeToPNG();
	Destroy (tex);

	// For testing purposes, also write to a file in the project folder
	File.WriteAllBytes(filePath, bytes);
}

元のサンプルとの主な相違点を解説します。

まずは Texture2D の画像フォーマット。元は TextureFormat.RGB24 だったのでアルファチャンネル付きの TextureFormat.ARGB32 に変更しました。

	var tex = new Texture2D (width, height, TextureFormat.ARGB32, false);

次にサンプルでは画像をサーバへ送信する形に成っていましたが以下の様にローカルに保存する形に変更して有ります。

	File.WriteAllBytes(filePath, bytes);