[MR Dev Tips #5] Azure Blob Storage へファイルをアップロードする

# はじめに
本日は Unity を使用した HoloLens 2 アプリケーションから Azure Blob Storage へファイルをアップロードする方法について、ご紹介したいと思います。

# 検証環境
Unity 2020.3.48f1

# Azure Blob Storage へファイルをアップロードする
Unity プロジェクト (C#) から Azure Blob Storage へファイルをアップロードするには、Microsoft が提供する Azure Blob Storage SDK for .NET を使用します。この SDK は NuGet のパッケージとして公開されています。今回は Unity プロジェクトで NuGet パッケージを管理するために、``NuGetForUnity`` を使用します。NuGetForUnity は Unity Editor で使用できる NuGet パッケージ管理システムです。

以下、GitHub の Release ページから ``NuGetForUnity.3.1.3.unitypackage`` をダウンロードします。

- [GlitchEnzo/NuGetForUnity](https://github.com/GlitchEnzo/NuGetForUnity)

Assets > Import Package > Custom Package... を選択して、ダウンロードしたファイルをインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/41b69b92-0602-7002-233e-502ca1f7c566.png)

すべてのファイルにチェックが入っていることを確認して Import ボタンを押下します。NuGet フォルダは Assets 配下に追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/2a53ab2a-895e-3861-979a-b08490feca5b.png)

インポートが完了したら、グローバルメニューに NuGet が追加されるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/2d13ccc6-0a13-37b9-eb7e-b7c83c703dee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/fffc1dc5-e533-3ebe-63b7-5f572dcbe65c.png)

Azure Blob Storage を検索して、インストールボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f8635224-3249-60b8-278b-e7244894c295.png)

インストールが完了すると、Assets > Packages 配下に Azure Blob Storage のフォルダが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/9ab3a711-f949-af87-0c0b-54f69463bcbe.png)

これで Unity 上で Azure Blob Storage SDK の使用する準備ができました。

以下のスクリプトに、Azure Blob Storage への接続文字列、コンテナ名、ファイル名を修正して、空の GameObject にアタッチして、Unity Editor 上で 再生 (Play) ボタンを押すと、対象のコンテナにファイルをアップロードすることができます。

```AzureBlobStorageUploader.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using Azure.Storage.Blobs;

/// <summary>
/// ローカルファイルを Azure Blob Storage へアップロードするためのサンプル
/// </summary>
public class AzureBlobStorageUploader : MonoBehaviour
{
    // Azure Blob Storage Account の接続文字列
    private string connectionString = <ConnectionString>;

    // データをアップロードする Azure Blob Storage のコンテナ名
    private string containerName = <containerName>;

    // アップロードするファイルのパス
    private string filePath = Path.Combine(Application.streamingAssetsPath, <fileName>);

    void Start()
    {
        // BlobContainerClient の取得
        BlobContainerClient container = new BlobContainerClient(connectionString, containerName);
        // BlobClient の取得
        BlobClient blob = container.GetBlobClient(<blobName>);
        // BlobClient を通じて、ローカルファイルを Azure Blob Storage へアップロード
        blob.Upload(filePath);
    }
}
```

**参考情報** 
NuGet とは？ ー Microsoft がサポートする .NET (.NET Core を含む) のコード共有メカニズムであり、.NET のパッケージマネージャーです。.NET 用のパッケージを作成、公開、使用する方法が定義されています。NuGet パッケージは拡張子が ``.nupkg`` の１つの ZIP ファイルであり、コンパイル済みのコード (.dll)、そのコードに関連する他のファイル、パッケージバージョン番号などの情報が記述されているマニフェストを含んでいます。

NuGet は Visual Studio に統合されています。ただし、Unity ではプロジェクトファイルを Unity で開くと、その Visual Studio プロジェクトファイルが再生成され、必要な構成が元に戻されてしまうため、NuGet パッケージを追加するには特別なプロセスが必要になります。

([NuGet の概要](https://learn.microsoft.com/ja-jp/nuget/what-is-nuget) より抜粋、加筆)

- [Azure Storage Blobs client library for .NET](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs_12.17.0/sdk/storage/Azure.Storage.Blobs)
- [NuGet から Unity プロジェクトにパッケージを追加する](https://learn.microsoft.com/ja-jp/visualstudio/gamedev/unity/unity-scripting-upgrade#add-packages-from-nuget-to-a-unity-project)