スクリーンショット

環境

Unity 5.6.4

撮り方

UnityではScreenCaptureクラスの「CaptureScreenshot」を呼ぶだけで
簡単にスクリーンショットを撮ることができます。

CaptureScreenShotメソッド仕様

メソッド名: CaptureScreenShot 戻り値: なし 引数: string fileName 保存するスクリーンショットのファイル名 int superSize 解像度の倍率 この値はデフォルト引数で、保存したスクリーンショットの 解像度を1倍として倍率の設定を行えます。 内容: 指定したファイル名で画面をスクリーンショットとして保存します。

ファイルの保存先

スクリーンショットの保存先は各プラットフォームごとに異なりますので 撮ったスクリーンショットを使用する場合は以下のパスを指定してください。

iPhone

Application.persistentDataPath + "/ファイル名";

Android

Application.persistentDataPath + "/ファイル名";

WinPlayer

"●●_Data/ファイル名";

UnityEditor

"ファイル名"

保存の流れ

スクリーンショットの保存処理はコルーチンで行うことが多いです。 理由としてはCaptureScreenShotを実行した直後に スクリーンショット画像を使用しようとすると保存が間に合っていないことがあり、 処理が失敗することがあるので、CaptureScreenShotを使用後から 確実に保存されたと判断する必要があるからです。 例: IEnumerator CeateScreenShot() { // スクリーンショットを撮る ScreenCapture.CaptureScreenshot("ScreenShot.png"); while (File.Exists("ScreenShot.png") == false) { yield return null; } } Existsメソッドは指定したファイルが存在するかを確認するメソッドです。 これを使用してスクリーンショットがきちんと保存されているまで 先に処理を進めないようにします。

1枚を使いまわす

SNS投稿用などでスクリーンショットを撮りたい場合は 1枚の画像を使いまわしたいと考えますが、 同名のファイル名ではExistsによるファイルの有無判定で 1つ前で保存したファイル存在するのでtrueが返り こちらが求める処理になりません。 なので、同名のファイル名を使いまわす場合は ファイルを書き込む前にFile.Deleteでファイルを消してから スクリーンショットを撮ります。 例: IEnumerator CeateScreenShot() { if ((File.Exists("ScreenShot.png") == true) { // ファイル削除 File.Delete("ScreenShot.png"); while (File.Exists("ScreenShot.png") == true) { yield return null; } } // スクリーンショットを撮る ScreenCapture.CaptureScreenshot("ScreenShot.png"); while (File.Exists("ScreenShot.png") == false) { yield return null; } }

画像使用

保存した画像をテクスチャとしてゲームに利用することが可能ですが
Unityで使用できるデータ形式に変換する必要があります。

Texture2D

Texture2Dはマテリアルなどの3Dオブジェクトに設定できるテクスチャのクラスです。 このTexture2Dで画像を使用するにはデータを変換して読み直す必要があります。 例: // ①.ファイル => バイナリ変換 byte[] image = File.ReadAllBytes(path); // ②.受け入れ用Texture2D作成 Texture2D tex = new Texture2D(0, 0); // ③.バイナリ => Texture変換 tex.LoadImage(image); // ④.Texture2Dをマテリアルに指定 MeshRenderer renderer = GameObject.Find("Cube"). GetComponent<MeshRenderer>(); renderer.materials[0].mainTexture = tex;

手順

①.画像データをバイナリデータとしてバイト配列に変換する まずは保存されている画像データを変換がしやすいバイト配列に変換します。 変換にはFileクラスのReadAllBytesメソッドを使用します。 メソッド名: ReadAllBytes 戻り値: byte[] 引数: string path 内容: 引数で指定されたファイルをバイト配列に変換します。 ②.画像を受け入れるTexture2Dクラスを用意 画像の変換が完了したら、次は画像を受け入れるための Texture2Dクラスを用意します。 Texture2Dのコンストラクタにはサイズの指定が必要ですが、 この後のバイナリを変換する処理で書き換わるので 何を指定しても問題ありません。 ③.画像読み込み 画像の読み込みはLoadImageメソッドを使用します。 メソッド名: LoadImage 戻り値: bool 読み込み可能 => true 読み込み不可 => false 引数: byte[] data 内容: 配列の画像データをテクスチャ変換し、 読み込みが可能ならtrue、不可ならfalseを返します。 ④.materialに設定する 作成したTexture2Dを設定したいオブジェクトのマテリアルに指定します。 unity_0184 unity_0184

Sprite

SpriteはUIや2Dで使用するSpriteオブジェクトで使用するクラスです。 読み込んだ画像を使うには一旦Texture2Dを作成します。 この作成したTexture2DをSpriteの変換で使用します。 例: // ①.ファイル => バイナリ変換 byte[] image = File.ReadAllBytes(path); // ②.受け入れ用Texture2D作成 Texture2D tex = new Texture2D(0, 0); // ③.バイナリ => Texture変換 tex.LoadImage(image); // ④.Spriteを作成する Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f)); // ⑤.Spriteを使用するオブジェクトに指定する // 今回はUIのImage m_DrawTex.GetComponent<Image>().sprite = sprite; // サイズ変更 m_DrawTex.GetComponent<RectTransform>().sizeDelta = new Vector2(tex.width, tex.height);

手順

①~③まではTexture2Dと同じなので省略します。 ④.Sprite作成 Spriteの作成はSpriteクラスのCreateメソッドを使用します。 そのメソッドの第一引数で①~③で作成したTexture2Dを使います。 メソッド名: Create 戻り値: Spriteオブジェクト 引数: Texture2D: Spriteに変換するTexture2Dオブジェクト Rect: テクスチャの矩形 Vector2: ピボット地点の相対位置 内容: Spriteオブジェクトを作成する ※オーバーロードでPixelsPerUnitなどを  指定することも可能です。 ⑤.オブジェクトに設定する 作成したスプライトをUIのImageやSpriteオブジェクトに設定します。 unity_0185 unity_0185