BoltとVoiceの統合
良いゲームの重要な特徴として、プレイヤー間のインタラクションがあります。これは様々な方法で行うことができます。プレイヤー同士でテキストを送ったり、キャラクターでジェスチャーをしたり、ゲーム中に会話をしたりすることで、ゲームをより楽しく流動的なものにすることができます。
Photon Voiceはシームレスな体験を生み出し、リアルタイムでのディスカッションの利便性をもたらします。
Photon Boltはゲームのネットワーク実装として使用され、プレイヤーの同期を維持することに焦点を当てています。しかし、テキストや音声ストリーミングのような機能は含まれていません。このチュートリアルでは、Photon BoltゲームをPhoton Voiceと統合し、プレイヤーがお互いに話せるようにします。
Photon Voiceの設定
まず最初に新しい空のUnityプロジェクトから始めることをお勧めします。
正常に動作することを確認したら、既存のゲームに設定してください。
以下の手順で、BoltプロジェクトにPhoton Voice SDKをセットアップします。
- Photon BoltをダウンロードしてUnityプロジェクトにインポートします。
- Asset StoreからPhoton VoiceをダウンロードしてUnityプロジェクトにインポートします。
- プロジェクトに既に存在するフォルダ
PhotonLibs
とPhotonRealtime
のチェックを外します。 - こちらの指示に従って、PUNを削除します。BoltとPUNは一緒に動作するものではないので、プロジェクトから削除することをお勧めします。
- こちら の指示に従ってください。
- クリアできないエラーがある場合は、Unity を再起動する必要があるかもしれません。
- Photon Bolt のサンプルをインポートします。
Assets/Photon/PhotonBolt/packages/
に移動し、bolt_samples.unitypackage
をインポートします。- 利用可能なサンプルをすべてインポートするか、
Voice
フォルダのみを選択します。Voice
サンプルが見つからない場合は、こちらの公開サンプルリポジトリから直接ダウンロードできます。(https://github.com/BoltEngine/Bolt-Sample/tree/master/Voice)
- Photon VoiceアプリケーションIDを設定します。
Assets/samples/Voice/prefabs/BoltVoiceBridge
でプレハブを開き、Voice Connection
コンポーネントを見ます。App Settings
セクションで、App Id Voice
フィールドを確認します。- Voice App IDを入力します。
- プロジェクトに既に存在するフォルダ
Scripting Define Symbols
でフラグBOLT_VOICE_SAMPLE
を指定することで、Voiceサンプルを有効にできます。詳細は こちら を参照してください。デフォルトでは無効になっています。プロジェクトに含まれていない可能性のあるPhoton Voiceからの参照を必要とするためです。
これで、Voice用に作られたBoltサンプルを使用するために必要なものが揃いました。
Voiceサンプルの使用
Bolt with Voiceのサンプルでは、以下のような機能を紹介します。
- シーン内のプレイヤーの位置を同期させて正確に動作させます。
- オーディオソースを管理して、近くのプレイヤーの声だけを聞くようにします(空間オーディオ)。
- 同じエリア内のプレイヤーだけがお互いに話をする「Voice Area」を管理します。
SDKに含まれていない場合は、[こちら](https://github.com/BoltEngine/Bolt-Sample/tree/master/Voice)のパブリックリポジトリからダウンロードしてください。
すべてのBoltゲームと同様、プレイヤーが使用するデータを定義する状態を作成する必要があります。
今回のサンプルでは、以下のようなシンプルな状態を使用します。
Transform
: プレイヤーの位置を同期させるために使用される通常のTransform
プロパティです。VoicePlayerID
: このプロパティはVoice Roomに接続されているVoiceクライアントの固有のIDを識別します。これは、特定のVoiceスピーカーを適切なプレイヤーにマッピングするために使用されます。
サンプルには2つのシーンが含まれています:(i) Voice_Menu
は、サーバやクライアントとして起動し、ゲームシーンを自動的に読み込むシンプルなメニューシーンです。(ii)また、実際のゲームンシーンであるVoice_Meeting
も読み込みます。
Meeting
シーンには、先ほど説明した「Voiceエリア」と呼ばれる3つのエリアがあります。これらのエリアの主な特徴は以下の通りです。(i) タグ GameController
がある、(ii) トリガーコライダーがある、(iii) プレイヤーが指示するグループを識別するコンポーネントBolt Voice Area
がある。
統合の重要な要素として、 BoltVoiceBridge
クラスがあります。これはPhoton Voiceとクラウドサービスとの接続を管理するだけでなく、プレイヤーが使用するVoiceスピーカーのインスタンスを作成して保存します。
コードがどのように動作するかについては、ソースコードを参照してください。要約すると、このクラスはPhoton Voice SDKにあるオリジナルのConnectAndJoin
クラスと非常によく似た動作をします。しかし、このクラスはBoltのイベントやプロパティをフックするので、プレイヤーは自動的にVoiceルームを作成/参加し、他のプレイヤーとオーディオを共有し始めます。
プレイヤーが Voice_Meeting
のシーンに入ると、自動的にVoiceルームに接続され、特定のVoice IDを受け取ります。
このVoiceルームは、_voice
で追加されたBoltセッションの名前を元にした名前で作成されます。これは不可視化されており、この名前を構築できるプレイヤーのみが接続できるようになっています。
リモートプレイヤーが検出されると、BoltVoiceBridge
はそのプレイヤー用の新しいSpeakerを作成して内部レジストリに保存し、BoltVoiceBridge.CustomBoltSpeakerFactory
を確認します。
スピーカーのレジストリは、Voice Player IDとスピーカーの間のマッピングであり、特定の参照が別のリモートプレーヤーに属していることを識別するために使用されます。
各プレイヤーがBoltゲームセッションに参加し、Voiceルームに接続すると、Boltプレイヤーの状態で自分のVoice Player IDの更新が始まります。
サンプルでは、プレイヤーはクラス BoltVoicePlayerController
によって制御されています。Boltに慣れている人は、これがシンプルなコントローラの実装であることに気づくでしょう。
各プレイヤーはローカルエンティティのプレイヤーを所有しているので、問題なく状態を変更することができます。
正しいスピーカーと正しいプレいヤーを親にするために、先ほどの VoicePlayerID
プロパティを使用します。これは、そのプレイヤーのIDを全てのピアで共有し、その情報を元に、BoltVoiceBridge
で作成したレジストリからSpeakerのリファレンスを収集します。
これはPlayer ControllerクラスのBoltVoicePlayerController.SetupSpeaker
メソッドで確認することができます。
Voiceグループは、プレイヤーがいる場所、具体的にはプレイヤーが出入りする場所に基づいて管理されます。
プレイヤーコントローラのTriggerコールバックを購読しているので、シーン上の「Voiceエリア」に入ったことを検出し、BoltVoiceArea
コンポーネントからグループIDを取得し、BoltVoiceBridge
に送信することで、Interest Group
(詳細はこちらと[こちら(~/realtime/current/gameplay/interestgroups)を参照)を変更することができるようになっています。
統合で使用するスピーカープレファブを変更したい場合は、Assets/samples/Voice/Prefabs/BoltSpatialSpeaker
の設定を変更してください。
デフォルトでは3Dサウンドとして動作するように設定されているので、近くにいるプレイヤーだけがお互いの声を聞くことができますが、必要に応じて簡単に変更することができます。
これで、このサンプルのすべての可動部分についての説明を終わります。
両方のシーンをBuild Settings
に含め、ゲームのスタンドアロン実行ファイルをビルドします。
BoltとVoiceをそれぞれのアプリケーションIDで正しく設定していれば、Boltサーバーとのセッションを作成し、クライアントとして入力することができます。
両方がゲームに参加すると、Voiceクライアントとしても接続され、お互いの声を聞くことができるようになります。
「Voiceエリア」に入ってみると、同じエリアにいるプレイヤーだけが、そのエリア内の他のプレイヤーからの音声を受信できます。
また、「外」のエリアもグループとして扱われるので、そこにいる人は「Voiceエリア」の中にいない他のプレイヤーの声を聞くことができます。