UnityからAzure Blob Storageにアクセスしてファイルをダウンロード&アップロードする方法を調査しました。
Azure Blob Storageは、このブログの画像をアップして配信するのにも使っていますが、堅牢で使いやすい割に価格が安くとても助かっています。
Blob Storageの作成には、Azure Portalにログインして、「ストレージアカウントの作成 > Blobコンテナの作成」の順で行います。1つのストレージアカウントの配下に、Blob,Table,Quere,Fileの各ストレージが紐づくイメージです。
画像やPDFなど汎用的なファイルを格納するのに便利なのがBlobストレージになります。
画像付きの手順は下記をご覧ください。
Unity用のSDKは下記からダウンロードできます。
「This is a Sandbox project.」と書いてある通り正式版のSDKでは無いらしいのですが、動作は問題なさそうです。
というか、「Azure Storage for Gaming」と謳うくらいなのだから、ちゃんと正式版のSDKを出してほしいですね。
画面の少し下の「.unitypackage」と書いてあるリンクからパッケージがダウンロードできます。
Unity 2018.1,2,3に対応しているそうですが、今回は2018.4LTSで試しています。
また、API Compatibility Levelを「.NET Standard 2.0」にする必要があります。
さて、Unityにインポートしてみると、いきなりエラーが出ています。
仕方がないのでAssets > Plugins > Microsoft.CSharp.dll を削除したら解消しました(いいのかな?)
Assets > AzureSamples > WindowsAzure.Storage > AzureStorageシーンを開いて、StorageObjectのインスペクタに、作成したストレージアカウントの接続文字列を入力します。
接続文字列は、Azure Portalのストレージアカウントの「アクセス キー」から確認することができます。
Key1、Key2とありますが、どちらでも構いません。(「キー」ではなく「接続文字列」を使用します)
設定後、Playして、「Blob Storage」のボタンをクリックしてエラーが発生しなければうまくいっています。
できるだけシンプルになるように下記のスクリプトを作って、Azure Blobからのダウンロードとアップロードを確認してみました。(単純にするためにUWPのコードは入れていません)
Connection StringとcontainerNameは自身で作成したものを入力してください。
ファイルを取得するのは、GetFileメソッドで行っています。
StreamingAssetPathにファイルをダウンロードして、そのファイルをbyte列に変換して返却し、テクスチャに変換してインスペクタで設定するGameObjectに設定することで表示しています。
上記ではコンテナ直下のファイルを指定していますが、
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
のところで、fileNameにパス付きのものを指定すれば、フォルダ内のファイルも取得できました。
Sキーを押すとスクリーンショットを録ってBlobにアップロードするようになっています。
(あらかじめStreamingAssetsフォルダの下にScreenShotsフォルダを作成しておく必要があります)
PutFileメソッドがアップロードを行っていますが、ここでも
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
のところでパス付きのfileNameを指定することができるので、そうするとBlobではフォルダに入った状態で格納されます。
なお、Azure Storage Explorerを使うと、上のようにStorageの中身が簡単に見れて便利です。
簡単なサンプルですが、SDKのお陰でBlobへのアクセスができました。