ホーリーのプログラミング日記

ホーリーのプログラミング日記

エキセントリック・スーパーアプリクリエイター / アプリ総DL数 約180万 / 全然分からない 俺は雰囲気でアプリを作ってる / iOS : apple.co/3m3HxSm / Android : bit.ly/3ma0liZ

Unityでスクリーンショットを撮って、それを画面に表示&シェア出来るようになったよ。

 

Unityでスクショを撮って、それを画面に表示&シェア出来るようにしたかったんですよ。

イメージはクロッシーロードのそれなんですが、このゲームって、車に轢かれてゲームオーバーになったときに、その画像が出てくるんです。

 

f:id:gevvoihorry:20180506132112j:plain

 

こんな風にやってみたいなと思いました。

 

結果から言えば、出来たものはこれです。こんな感じに出来ました。

 

 

バイクで事故る。結果画面にその画像を表示。んでシェアも出来ると。

 

出来てしまえばなんてことないんですが、いつものように苦戦したので、ちょっとその過程を書いてみたいと思います。

 

Unityでスクリーンショットを撮る

まずはUnityでスクリーンショットを撮るとこからですね。これは非常に簡単でした。マジでコード1行だけ。

 

Application.CaptureScreenshot("screenshot.png",2);

 

これでOK。ちなみに第二引数は解像度です。ここに値を入れると解像度が上がるみたい。

高画質なスクリーンショットを撮影する - テラシュールブログ

 

参考にさせていただいたのは、クリアメモリさんの記事。

【Unity】CaptureScreenshotの保存先を変更する方法 - クリアメモリ

 

(クリアメモリさんの記事っていつも分かりやすい)

 

撮ったスクショが黒くなる問題

あ、そうそう。スクショ簡単に出来たって言いましたけど、あれ嘘です。嘘でしたw

撮るはいいものの、なんか真っ黒に表示されたりしてたんですよ。

んで、コンソールを見たら、こんなエラーログが出てました。

 

GfxFramebufferGLES: An active RenderTargetSetup has dangling pointers

 

これをコピペしてググったら、こちらの記事がヒット。

ハマケン100%開発: [Unity] Unity Remote使用時のGfxFramebufferGLESエラー解消策

 

Edit > Quality Settings > Anti Aliasing を Disable にすると、当該エラーが出なくなるのを確認しました。

 

この通りにやってみたら解決しました。

 

スクリーンショットした画像をシェアする

スクショした画像のシェアですが、これもクリアメモリさんを見ながら出来ました。

ソーシャルコネクターを使って、そこに画像のパスを送ればOKですね。

【Unity】SocialConnectorで画像付きツイートができない時の対処法! - クリアメモリ

 

スクショを撮ってから、それが保存されるまでのタイムラグが一瞬あるらしいので、どの記事を見ても、みんな1秒ほどの間を持たせてますね。

スクショが保存されたかどうかを検知する方法もあるらしいですが、今回は使用を見送りました。

スクリーンショットの撮影と撮影完了の検知【Unity】 - (:3[kanのメモ帳]

 

スクリーンショットした画像を画面に表示させる

これこれ。これですよ。ここで盛大にハマりました。

スクショしてすぐにシェアするのは簡単なんですが、その前に画面に表示させるのが出来なかったんです。

結論から言えば、こちらの記事を参考にさせていただきました。

Unity でスクリーンショットを撮って画像を表示 · GitHub

 

(記事っていうかGitHubですね。GitHubが何なのか分かってないけどw)

 

画像ファイルのパスからTextureを作って、それをなんちゃらすると。

これそのままだと自分のやりたい感じにならなかったので、ちょこちょこアレンジして、こんな感じに書いてみました。

 

string picturePass = PlayerPrefs.GetString ("PICTURE_PASS", "");
byte[] image = File.ReadAllBytes(picturePass);

Texture2D tex = new Texture2D(0, 0);
tex.LoadImage(image);

Sprite texture_sprite = Sprite.Create(tex, new Rect(0,0,tex.width,tex.height), Vector2.zero);

imageClash.GetComponent<Image> ().sprite = texture_sprite;

 

スクショしたときに、その画像へのパスをPICTURE_PASSに格納して、それを任意の場面で呼び出してます。

そこからSpriteを作って、それをimageClashってオブジェクトに代入しています。

 

ちなみにFile.ReadAllBytesを使うにあたって、using System.IO; を宣言しました。これないとエラーになったんで。

 

おしまい

ちょろちょろと書いてきましたが、これでおしまいです。なにはともあれ出来てよかったですよ。

いつも何か新しいことをしようとすると、すぐエラーの森に入ってしまいますね。今回もしっかり入ってきましたw

 

【追記 2018/05/19】

おもちゃラボさんが、めっちゃ詳しい記事を書いてたので、そのリンクを貼っておきます。

【Unity】Social ConnectorでTwitterにスクショを投稿する - おもちゃラボ