スクリーンショット

■環境

Unity 5.6.4

■撮り方

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

●メソッド仕様
	関数名:
		CaptureScreenShot

	戻り値:
		なし

	引数:
		string fileName
			保存するスクリーンショットのファイル名

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

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

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

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

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

	・UnityEditor
		"ファイル名"

●保存の流れ
	スクリーンショットの保存処理はコルーチンで行うことが多いです。
	理由としてはCaptureScreenShotを実行した直後に
	スクリーンショット画像を使用しようとすると保存が間に合っていないことがあり、
	処理が失敗することがあるので、CaptureScreenShotを使用後から
	確実に保存されたと判断する必要があるからです。
	
	・例

		IEnumerator CeateScreenShot()
		{
		        // スクリーンショットを撮る
		        Application.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;
				}
			}

		        // スクリーンショットを撮る
		        Application.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

●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