ノベルゲームのセーブ画面のUIなど、ゲームの画面を画像素材として使用したい時があります。
Unityのゲーム中にスクリーンショットを作成し、必要であればファイルに出力をし、
ゲームオブジェクトとして使用する例をご紹介します。
作業環境
- MacBook Air
- macOS Sierra 10.12.6
- Unity 5.5.4p5
スクリーンショットの撮影
今回のサンプルではボタンを2つ用意し、
それぞれ撮影ボタンと表示ボタンとして使用します。
新しくスクリプトを作成し、コードは以下のようにします。
スクリプトの作成を終えたら、空のゲームオブジェクトを作成し、
先ほどのスクリプトをアタッチします。
撮影用ボタンを作成します。
UI>Buttonからボタンを作成し、OnClick()に
先ほどのスクリプトのClickShootButton()を設定します。
撮影用ボタンを押すことでスクリーンショットが撮影され、スクリプト内の「screenShotPath」変数を使って指定されているパスにファイルが保存されます。
スクリーンショットの表示
保存されたスクリーンショットを表示する場合は、もう1つUIを用意します。
RawImageを作成し、撮影時に生成した「Texture2D」を貼り付けます。
UI>RawImageから「RawImage」を作成し、さらに「RawImage」に
「Add Component」ボタンから「Button」コンポーネントを追加します。
RawImageを適当な位置に配置し、Scaleを見やすい大きさに調節しておきます。
RawImageに追加したButtonコンポーネントのOnClick()には、
先ほどのスクリプトのShowSSImageを設定しておきます。
先ほど作成した撮影用ボタンを押した後に、RawImageオブジェクトをクリックする事で、
撮影したスクリーンショットを表示することができます。
今回のサンプルでは直前に撮ったスクリーンショットしか表示できませんが、
撮影した画像へのパスを記憶しておけば、いつでも任意の画像を呼び出すことができます。
スクリプト解説
撮影部分の処理はコルーチンのCreateScreenShot()で行なっています。
カメラに描画されている内容をスクリーンショットとして使うので、
そのフレームの描画を待つためにコルーチンを使ってフレームの最後まで待っています。
カメラの描画内容から「Texture2D」を作成し、
バイト配列に変換したあとpngファイルに書き出します。
最後に、次に撮影する時に以前の画像が残らないように
targetTextureに登録していた内容を削除しておきます。
サンプルプロジェクト
今回のサンプルプロジェクトはこちらです。
スクリーンショットの保存先は、プロジェクトフォルダ直下になっています。
また、撮影の際に画面に変化が出るように、回転するCubeをばら撒くようにしています。
入社3年目のエンジニアです。
主にiOS/Androidアプリの開発をしています。