なんかいろいろしてみます

Mar 27, 2021 - 1 minute read - HoloLens

Azure Remote RenderingのShowcaseでPhotonシェアリングとボイスチャットを追加する方法+α

Azure Remote RenderingのShowcaseプロジェクトで利用されているPhotonによるSharing機能を利用,機能拡張します.

Azure Remote Rendering

PhotonによるSharing機能の設定

  • 複数のプラットフォームでマルチプレイヤー機能を実装できるネットワークサービス

  • あらかじめPhotonのサイトにてPhoton RealitimeのアプリケーションIDを取得しておいてください

ShowcaseにPhoton導入

  • Azure Remote RenderingのShowcaseプロジェクトにPhotonを追加します.

  • UnityのAssets StoreからPhotonのアセットPUN 2 - FREEをダウンロード,インポートします.

  • インポート後PUN Setup画面にアプリケーションIDを入力後,HierarchyのMixedRealityToolkit内の要素に以下を追加

    • Extensions/SharingService/Photon Settings/Photon Realtime IdにアプリケーションIDを入力
  • またPhoton内でマルチプレイヤー接続のためにリージョンを固定しておきます.(今回は日本サーバーにしたいのでjp)

    • UnityメニューからWindow/Photn Unity Networking/Highlight Server Settingsを選択
    • Server/Cloud Settings/Fixed RegionDev Regionjpと入力
  • ビルドすると複数HoloLens 2 またはHoloLens 2とデスクトップアプリで表示されるAzure Remote Rendering表示モデルが同期して表示,移動,操作することが確認できます.

  • PhotonのSharing機能だけではHoloLens 2同士の位置合わせ行われないので起動位置によってモデルの表示位置は異なります.

  • HoloLens同士の位置合わせを行う場合には別途Azure Spatial Anchorを設定する必要があります.

ボイスチャットの追加

  • 遠隔地からのモデルのSharingができるとそのまま会話もしたくなったのでPhotonのボイスチャットサービスを追加してみます.

  • PhotonにはボイスチャットのサービスとしてPhoton Voiceが用意されています.

Photon Voiceの導入

  • あらかじめPhotonのページからPhoton Voiceを設定してアプリケーションIDを取得しておきます.

  • UnityのAssets StoreからPhoton Voice 2をダウンロード,インポートします.

  • インポート後にAndroidのAndroidJNIModuleライブラリが不足している警告が出る場合があります.

    • UnityメニューのWindow/Package Managerを選択してPackage Managerウィンドウ左上のUnity RegistryBuild-in packagesに切り替えます.
    • パッケージ一覧からAndroid JNIを選択しEnableしてパッケージをインポートします.
  • UnityメニューからWindow/Photn Unity Networking/Highlight Server Settingsを選択

    • Server/Cloud Settings/App Id VoiceにPhoton VoiceアプリケーションIDを入力

GameObject設定

  • Showcaseプロジェクトではボイスチャット機能は標準で実装されていません.そのためボイスチャット部分だけ組み立てる必要があります.
  • Photon VoiceはSharingで利用しているPhotonとネットワーク設定を共有することができるので,ボイスの受信と送信機能を作成します.

  • Photon Voiceではマイクからネットワークに音声を送信する部分をRecorder,ネットワークから受信した音声データを再生する部分をSpeakerとしてシーンに配置します.

Speaker機能追加

  • Speakerはネットワーク上で接続された他のプレイヤー毎に必要になるため,事前にシーン上には配置せず動的に生成します.
  • 今回はResourcesフォルダにPrefabを作成して,新規プレイヤーが接続されたらPrefabからSpeakerを生成する方法を利用します.
  • 空のGameObjectに以下のコンポーネントを設置し
    • PhotonView
    • AudioSource
    • PhotonVoiceView
    • Speaker
  • PhotonVoiceViewに以下を設定します.
    • Speaker In Useに同じGameObject内のSpeaker
    • Use Primary Recorderにチェック
  • 設定したGameObjectをPrefab化してResourcesフォルダ内に配置しておきます.

  • Photonに接続されたプレイヤーを動的に生成するためのスクリプトをシーンの適当なオブジェクトにPhotonVoiceNetworkと配置します.

  • MonoBehaviourPunCallbacksを継承したスクリプトPhotonVoiceJoinPlayer.csを作成し,playerPrefabResourceフォルダのPrefabをアタッチしておきます.

 1 2 3 4 5 6 7 8 910111213141516
using Photon.Pun;
using UnityEngine;

public class PhotonVoiceJoinPlayer : MonoBehaviourPunCallbacks
{
    [SerializeField] private GameObject playerPrefab;

    public override void OnConnectedToMaster()
    {
    }

    public override void OnJoinedRoom()
    {
        PhotonNetwork.Instantiate(playerPrefab.name, Vector3.zero, Quaternion.identity);
    }
}

Recorder機能追加

  • ボイスの送信はプレイヤーに対して一つのみ必要なのでシーン上のGameObjectにスクリプトを設定します.

  • Speaker設定で作成したシーン上のPhotonVoiceNetworkと同じオブジェクトにRecorderをアタッチし以下のように設定します.

手動位置合わせ機能の追加

  • ShowcaseプロジェクトでサポートされているHoloLens同士の位置合わせにはAzure Spatial Anchorを利用しています.
  • 遠隔地でそれぞれの基準位置設定や,手軽な位置設定には不向きなので手動でできるようにGizmoでのマニピュレーション移動を追加してみました.

  • MRTK内MRTK/StandardAssets/Controllers/DEbugControllersGizmoLeft.prefabを利用してハンドまにぴょレーションを追加します.

  • GizmoLeft/prefabをシーン内のRemotePlayspace/RemoteObjects内に配置し,以下の画像のようにコンポーネントと値を設定します.

    • BoxCollider
    • NearInteractionGrabbable
    • ManipulationHandler
  • RemotePlayspace直下だとHoloLensのWorldAnchorとAzure Spatial Anchorのシステムと競合するためRemoteObjects以下に配置しています.