読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

スクリーンショットの撮影と撮影完了の検知【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.4.0f3


はじめに

今回はUnityを使ったゲーム上でのスクリーンショットの撮り方と、

撮り終わった事を検知する方法のご紹介です!


Application.CaptureScreenshot

スクショはApplication.CaptureScreenshotを使えば簡単に撮る事が出来ます。

Unityエディター上はもちろん、iOSやAndroidでも大丈夫です。

PNG ファイルとしてfilenameのパスでスクリーンショットを撮ります。

Application.CaptureScreenshot("Screenshot.png");


第二引数で解像度を変える事も可能です。



しかし、残念ながら

Application.CaptureScreenshotだけでは撮影完了の検知は出来ません。


撮影完了の検知

撮影完了を検知するために以下のような方法を考えました。

  1. 前に撮影したスクショを消す
  2. 新たにスクショを撮影
  3. 撮影したスクショが存在しているか(保存されているか)判定
  4. 存在していなければ1フレーム飛ばして3へ、存在していれば終了


実際にこの方法を試した所、

Unityエディター上はもちろん、iOSやAndroid実機でも問題ありませんでした。


ScreenshotCaptor

上記のスクリーンショット撮影と撮影完了の検知をまとめたのクラス、

ScreenshotCaptorを作ったのでこれもご紹介!


念のため、2秒以上待ってもスクショが保存されない場合は警告を出して

コールバックを実行するようにしています。



使い方は以下のような感じで

MonoBehaviourを継承したクラスからStartCoroutineを使ってメソッドを実行します。

/// <summary>
/// スクショを撮影
/// </summary>
public void Capture () {
  
  StartCoroutine (
    ScreenshotCaptor.Capture (
      imageName:"Screenshot.png", 
      callback:Callback
    )
  );

}

//撮影完了時に実行される
private void Callback(){
  Debug.Log ("撮影完了");
}


なお、imageNameやcallbackは省略可能です。


おわりに

余談ですが、撮ったスクショをシェアしたい場合はSocial Connectorがおすすめ。




写真を撮ってシェアする場合は以下のような感じになると思います。(動作未確認)

string imageName = "image.png";

StartCoroutine(
  ScreenshotCaptor.Capture(
    imageName:imageName, 
    callback:()=>{
      SocialConnector.Share("シェアメッセージ""URL", Application.persistentDataPath + "/" + imageName);
    }
  )
);