mBaaSお役立ちブログ

NCMB Unity SDKでスクリーンショットの公開機能を作ってみる

7月7日、BitSummit出展準備でめっちゃ忙しい七夕の日、NCMB Unity SDKがv2.2.0にアップデートされ、新たに「ファイルストア機能」が追加されました!

ファイルストア機能とは?

画像やテキスト、音楽などさまざまな種類のファイルを保存することができるストレージ機能です。
NCMBFileStoreDescription

mb.cloud.nifty.com/function.htm#filestore

「データストア機能」は文字列や数値などの保存に利用するものですが、ファイルストアはメディアコンテンツである画像や音声、動画を保存しておくことができます。

ファイルはアプリから保存することもできますし、管理画面からデータをアップロードすることもできます。
逆に保存されたデータはアプリで読み込むこともできますし、ブラウザから見ることもできます。

今回は後者のアプリ→NCMB→Webの順番で画像データをアップし、アプリにスクリーンショットの公開機能をつけてみます。

まずはスクリーンショットを生成

Unityにおけるスクリーンショットの撮影はApplication.CaptureScreenshot()を使ってもよいのですが、保存位置を指定できなかったり完了時のコールバックが無かったりで使いにくいので、今回はTexture2DクラスのReadPixels()を使ってスクリーンショットを生成する方法をとります。

適当なシーンにボタンを配置します。

ScreenShot

※特に面白い絵を出す余裕がなかった。

ボタンから下記のスクリプトを呼び出すようにしましょう。
実際にNCMBのファイルストアに保存するには、Texture2Dのデータをjpg画像にエンコードしてバイト配列にしてやり、NCMBFIleクラスに渡してSaveAsyncを呼びます。

int width = Screen.width;
int height = Screen.height;
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
tex.Apply();
byte[] screenshot = tex.EncodeToJPG();

NCMBFile file = new NCMBFile("ScreenShot.jpg", screenshot);
file.SaveAsync((NCMBException error) => {
if (error != null)
{
// 失敗
}
else
{
// 成功
}
});

はい!これで保存できました。管理画面で確認するとファイルが確認できます。

NCMBFileStoreConsole

続いて、このファイルストアに保存した画像ファイルをhttpsで取得したいので、管理画面のアプリ設定→データ・ファイルストアから、「公開ファイル設定」のHTTPSでの取得を「有効」にして下さい。

NCMBFileStoreConsoleSetting

これで、アプリで保存したスクリーンショットをブラウザから見ることができます。
URL命名規則は

https://mb.api.cloud.nifty.com/2013-09-01/applications/YOUR_APPLICATION_ID/publicFiles/YOUR_FILE_NAME

となり、YOUR_APPLICATION_IDが管理画面から確認できるアプリID、YOUR_FILE_NAMEがファイルストアに保存したファイル名を指定します。

スマホのブラウザからアクセスしてみました。

NCMBFileStore_SSonSafari

今回は特にユーザー管理をやってないので、全ユーザーが「ScreenShot.jpg」を上書きし続けるアレな感じになっています。が、これはこれでゲームの公式サイトのトップにリンクしたりすれば、常に新しいバトルのスクショが見れる、みたいな仕掛けが作れそうです。

 もちろんユーザーごとにファイルを設定して、アプリの中から他の人のスクリーンショットを見る機能も作れたりします。
コミュニティ機能を作ってみたい人は、ぜひ「ファイルストア機能」を触ってみてください。
余談ですが、原理的にはUnityのAssetBundleファイルを置くこともできそうです。
しかしNCMBは所謂CDNではないので、大勢が大きいファイルを一斉にダウンロードするような使い方には向いていないです。
この辺は、ほかサービスとの連携がよさそうですね。

バックナンバー