夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Azure RemoteRendering を動かす その② ARRの状態遷移とプロジェクトの構築

本日は昨日に引き継ぎAzure勉強枠です。

現在Azure RemoteRenderingの勉強を行っています。

Microsoft のチュートリアルを読み解きながら進めていきます。

docs.microsoft.com

先日は概要のおさらいとAzurePortalでのリソースの作成を行いました。

redhologerbera.hatenablog.com

〇Unityプロジェクトの準備

①Unity上部ワールドメニューから[Remote Rendering]メニューを選択し、[ValidateProject]を開きます。

②エラーが発生している項目を[Fix]ボタンを押し解消します。

この操作によってプロジェクトがAzure RemoteRenderingを使用するために最適化されていきます。

③Assets内に[RemoteRenderingCore]→[Scripts]というフォルダを作成し[RemoteRenderingCoordinator]スクリプトを作成します。

[RemoteRenderingCoordinator]スクリプトの中身はMicrosoftのドキュメント(以下)の中段よりコピー&ペーストします。

docs.microsoft.com

④からのゲームオブジェクトを作成し作成した[RemoteRenderingCoordinator]をアタッチします。

この際[Service]コンポーネントも自動的にアタッチされます。これはUnityのアトリビュートとして [RequireComponent(typeof(ARRServiceUnity))] がスクリプト内に記述されているためです。

⑤Azureの視覚情報を入力します。

・AccountID

・Account Dmain

・Account Key

〇AzureRemoteRenderingの状態

AzureRemoteRenderingではステップごとにステータス(状態)変化が行われます。

これはRemoteRenderingCoordinator内で定義されています。

    public enum RemoteRenderingState
    {
        NotSet,
        NotInitialized,
        NotAuthorized,
        NoSession,
        ConnectingToExistingRemoteSession,
        ConnectingToNewRemoteSession,
        RemoteSessionReady,
        ConnectingToRuntime,
        RuntimeConnected
    }

[NotSet]→[NotInitialized(初期化されていない)]→[NotAuthorized(非承認)]→[NoSession(セッション無し)]→[ConnectingToExistingRemoteSession(既存のリモートセッションへの接続)]→[ ConnectingToNewRemoteSession(新しいリモートセッションへの接続)]→[RemoteSessionReady(リモートセッションの準備)]→[ConnectingToRuntime(ランタイムへの接続)]→[RuntimeConnected(ランタイム接続)]の順で進行しリモートレンダリングに接続します。

〇Azure Remote Renderingの初期化

Azure RemoteRenderingでは初期化→リモートレンダリングセッションの作成→ローカルセッションへの接続→モデルのロードと描画というような4つの工程で処理が行われています。

https://docs.microsoft.com/ja-jp/azure/remote-rendering/tutorials/unity/view-remote-models/view-remote-models より

Initializeではレンダリングに使用するカメラオブジェクト(ユーザーの位置)をAzure RemoteRenderingに渡しステートマシーンをNotAuthorizedに進行させます。

このステートマシーンとはAzure RemoteRenderingの状態遷移をつかさどる部分です。

NotAuthorized(非承認)になる理由として、Azure RemoteRenderingではコストが高いため、ユーザーのセッションがまだ開始されていないが初期化された(準備できた)という状態を意味します。

NotAuthorized状態へ変わるとCheckAuthorizationが呼び出されRequestingAuythorizationイベントが呼び出されアカウント情報を決定します。

前述のとおりRemoteRenderingはコストが高いためユーザーの意思を確認してアカウント情報を使用しています。

RemoteRenderingCoordinatorコンポーネントのInitializeARRおよび InitializeSessionServiceを書き換えます。

/// <summary>
/// ARRを初期化、メインカメラと関連付けを行う
/// Note: Unityのメインスレッドで呼び出す必要あり
/// </summary>
public void InitializeARR()
{
   RemoteManagerUnity.InitializeManager(new RemoteUnityClientInit(Camera.main));//メインカメラとの関連付け
   CurrentCoordinatorState = RemoteRenderingState.NotAuthorized;//ステートマシーンの遷移
}

/// <summary>
/// 新規でリモートセッションマネージャーの作成
/// If the ARRCredentialGetter is set, use it as it, otherwise use the development credentials 
/// </summary>
public async void InitializeSessionService()
{
   if (ARRCredentialGetter == null)
       ARRCredentialGetter = GetDevelopmentCredentials;

   var sessionConfiguration = await ARRCredentialGetter.Invoke();

   ARRSessionService.OnSessionStatusChanged += OnRemoteSessionStatusChanged;

   try
   {
       ARRSessionService.Initialize(sessionConfiguration);
   }
   catch (ArgumentException argumentException)
   {
       NotificationBar.Message("InitializeSessionService failed: SessionConfiguration is invalid.");
       Debug.LogError(argumentException.Message);
       CurrentCoordinatorState = RemoteRenderingState.NotAuthorized;
       return;
   }

   CurrentCoordinatorState = RemoteRenderingState.NoSession;
}

NotAuthorizedからセッションへ移行するためにユーザーの選択をさせます。

今回はOnRequestingAuthorizationが発火されるとByPassAuthenticationを呼び出し自動的に認証を行うことにして進めます。

OnRequestingAuthorizationイベントにイベントを加え自分自身をアタッチ、[RemoteRenderingCoordinator/BypassAuthorization]を設定します。

これによりNotAuthorized状態へ遷移したらBypassAuthorizationが実行されるようになります。

この状態でUnityを実行すると状態遷移が行われステータスがNoSession状態へ移行します。

本日は以上です。

明日以降で次の接続を見ていきます。