スクリーンショット
環境
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を設定したいオブジェクトのマテリアルに指定します。
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オブジェクトに設定します。