はじめに
Unityで3Dオブジェクトを表示する場合、一番簡単な方法はアプリケーションの中に組み込むことです。ただ、これだと3Dオブジェクトが固定されてしまいます。そこで今回は外部のストレージから3Dオブジェクトを取得する方法について調査しました。
環境
Unity2020.3.36f1
MRTK 2.8.2
Azure.Storage.Blobs version 12.13.0
実装のポイント
Blob StorageのSDKの導入
UnityでBlob Storageのデータを取得するためにSDKを利用します。導入方法については以前投稿した記事に書きました。
実装手順
内のNuGetForUnityの導入
とBlob Storageのパッケージの導入
を参考にしていただければと思います。
今回はSDKを使ってGLB形式の3Dモデルをバイト配列として取得します。
3Dモデルの表示
MRTKのGltfUtility
というクラスを使うとスクリプトからGLB形式の3Dモデルを取得することができます。
今回はGetGltfObjectFromGlb
というメソッドを利用します。これを使うとバイト配列で取得した3DモデルをUnityで利用する形に変換することができます。
手順
Blob Storageにアップロード
GLB形式の3Dモデルをアップロードします。具体的な手順は以下のドキュメントをご覧ください。
Unityでの実装
まずはUnityで以下のスクリプトを作ります。
using Azure.Storage.Blobs; using Microsoft.MixedReality.Toolkit.Utilities.Gltf.Serialization; using UnityEngine; public class GlbTest : MonoBehaviour { string connectionString = "[Blob Storageの接続文字列]"; string containerName = "[3Dモデルを保存したコンテナ名]"; string fileName = "[3Dモデルのファイル名]"; async void Start() { //Blob Storageのクライアントを作成 BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString); //Blob Storageのコンテナのクライアントを作成 BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName); //ダウンロードした3Dモデルを取得 var content = await containerClient.GetBlobClient(fileName).DownloadContentAsync(); //バイト配列に変換 byte[] glbByteArray = content.Value.Content.ToArray(); //GLB形式の3Dモデルのバイト配列からUnity上で使えるように変換 GameObject glbModel = await GltfUtility.GetGltfObjectFromGlb(glbByteArray).ConstructAsync(); //現在の位置情報を取得 Vector3 currentPosition = Camera.main.transform.position; //3Dモデルの位置を調整(自分の目の前に来るようにする) glbModel.transform.position = new Vector3(currentPosition.x, currentPosition.y, currentPosition.z + 0.5f); ; } }
次に①Unityエディタで空のオブジェクトを作り、②先ほど作成したスクリプトを追加します。
以上で準備完了です。
あとはUnityエディタの実行、またはHoloLens 2にデプロイしてアプリを起動すれば自動的に目の前にオブジェクトが現れます。
最後に
今回は3Dオブジェクト固定、タイミングもアプリ起動時に指定していましたが、Blob Storageにたくさん3Dモデルを保存しておき、ユーザーがアプリ側で選択して表示できたら役立ちそうですね。