本日は昨日に引き継ぎAzure勉強枠です。
現在Azure RemoteRenderingの勉強を行っています。
Microsoft のチュートリアルを読み解きながら進めていきます。
先日は概要のおさらいとAzurePortalでのリソースの作成を行いました。
〇Unityプロジェクトの準備
①Unity上部ワールドメニューから[Remote Rendering]メニューを選択し、[ValidateProject]を開きます。
②エラーが発生している項目を[Fix]ボタンを押し解消します。
この操作によってプロジェクトがAzure RemoteRenderingを使用するために最適化されていきます。
③Assets内に[RemoteRenderingCore]→[Scripts]というフォルダを作成し[RemoteRenderingCoordinator]スクリプトを作成します。
[RemoteRenderingCoordinator]スクリプトの中身はMicrosoftのドキュメント(以下)の中段よりコピー&ペーストします。
④からのゲームオブジェクトを作成し作成した[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つの工程で処理が行われています。
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状態へ移行します。
本日は以上です。
明日以降で次の接続を見ていきます。