🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

832閲覧

Photon Fusion × Photon Voice 2 でのチャンネル切り替えができない

hosoken1

総合スコア3

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/10/12 15:22

編集2023/10/13 00:10

実現したいこと

Photon Voice 2 を使ったボイスチャットのチャンネル切り替え機能を実装して、特定の人とだけ会話できるようにしたい。

前提

Photon Voice を使ったボイスチャット機能の開発をしています。
特定のグループでの会話を実現するために、送受信するチャンネルを切り替えようとしています。

クリーンアーキテクチャで開発しています。

発生している問題・エラーメッセージ

Recorder の Interest Group を変更する処理は正常に動作するがFusionVoiceClient.Client.OpChangeGroup();を実行してもFusion Voice Clientのチャンネルが切り替わらない。
そのため、送信のみが切り替えたいチャンネルに送信されてしまい、音声を聞くことができないという状況です。

UnityのConsoleにはエラーは出力されていません。

Debug.Logで出力した結果は以下の通りです。
selected channel : メソッドの引数をそのままintに直したものを出力
voice Channel Number : selected channelに+1した値を出力。+1はチャンネルが0にならないようにするための処置。
Channel Change : voice Channel Number を byte に変換した値を出力。
Voice Channel : どのチャンネルに切り替えたかを出力。

チャンネルをLobbyに切り替えた場合 selected channel : 0, voice Channel Number : 1 Channel Change : 1 Voice Channel : Lobby GameTeam1に切り替えた場合 selected channel : 1, voice Channel Number : 2 Channel Change : 2 Voice Channel : GameTeam1 GameTeam2に切り替えた場合 selected channel : 2, voice Channel Number : 3 Channel Change : 3 Voice Channel : GameTeam2

該当のソースコード

チャンネルを変更している側のスクリプト View
(問題は主にこのスクリプトにあると考えています)

C#

1public void VoiceChatControlView : MonoBehaviour, IVoiceChatControlView 2{ 3 [SerializeField] private FusionVoiceClient _fusionVoiceClient; 4 [SerializeField] private Recorder _recorder; 5 6 // ------------------ 省略 -------------------------------------- 7 8 // Voice Channel の定義は別のスクリプトに記載。中身は自作したEnum型の変数 9 public void ChangeVoiceChannel(VoiceChannel voiceChannel) 10 { 11 // Channel 0 is that all player can listen. so Channel 0 is never used. 12 //"(int)voiceChannel + 1" is written to prevent channel 0 from being used. 13 var voiceChannelNumber = (int)voiceChannel + 1; 14 Debug.Log($"selected channel : {(int)voiceChannel}, voice Channel Number : {voiceChannelNumber}"); 15 SetVoiceChannel((byte)voiceChannelNumber); 16 } 17 18 private void SetVoiceChannel(byte channelNumber) 19 { 20 // If the Client cannot be obtained, the process cannot be executed and is aborted. 21 if (_fusionVoiceClient.Client == null) 22 { 23 Debug.Log("Client is Null."); 24 return; 25 } 26 27 // If the state is other than Joined, the process is aborted. 28 if (_fusionVoiceClient.ClientState != ClientState.Joined) 29 { 30 Debug.Log("Not Ready For Change Interest Group"); 31 return; 32 } 33 34 // Empty arrays are unsubscribed for all channels. 35 var remove = new byte[0]; 36 37 // Specify the channel of the group to which you want to subscribe. 38 var add = new byte[] { channelNumber }; 39 40 // Change Voice Channel 41 _fusionVoiceClient.Client.OpChangeGroups(remove, add); 42 _recorder.InterestGroup = channelNumber; 43 Debug.Log($"Channel Change : {channelNumber}"); 44 } 45}

VoiceChatControlPresenter.cs

C#

1public class VoiceChatControlPresenter : IVoiceChatControlPresenter 2{ 3 private readonly IVoiceChatControlView _voiceChatControlView; 4 5 [Inject] 6 private VoiceChatControlPresenter 7 ( 8 IVoiceChatControlView voiceChatControlView 9 ) 10 { 11 _voiceChatControlView = voiceChatControlView; 12 } 13 14 public void ChangeVoiceChannel(VoiceChannel voiceChannel) 15 { 16 _voiceChatControlView.ChangeVoiceChannel(voiceChannel); 17 } 18} 19

VoiceChannelを切り替えるスクリプト VoiceChatControlUseCase.cs

C#

1public class VoiceChatControlUseCase 2 : IVoiceChatControlUseCase, IInitializable, ITickable, IDisposable 3{ 4 private readonly IVoiceChatControlDataStore _voiceChatControlDataStore; 5 private readonly IVoiceChatControlPresenter _voiceChatControlPresenter; 6 private readonly CompositeDisposable _disposable = new (); 7 8 [Inject] 9 private VoiceChatControlUseCase 10 ( 11 IVoiceChatControlPresenter voiceChatControlPresenter, 12 IVoiceChatControlDataStore voiceChatControlDataStore 13 ) 14 { 15 _voiceChatControlPresenter = voiceChatControlPresenter; 16 _voiceChatControlDataStore = voiceChatControlDataStore; 17 } 18 19 public void Initialize() 20 { 21 // Subscribe to events when Voice Channel is changed 22 // onChangeVoiceChannel = ReactiveProperty<VoiceChannel> 23 _voiceChatControlDataStore.VoiceChatControlData 24 .onChangeVoiceChannel 25 .Subscribe(voiceChannel => _voiceChatControlPresenter.ChangeVoiceChannel(voiceChannel)) 26 .AddTo(_disposable); 27 } 28 29 public void Tick() 30 { 31#if UNITY_EDITOR 32 33 // Change VoiceChannel to Lobby 34 if (Keyboard.current.digit1Key.wasPressedThisFrame) 35 { 36 _voiceChatControlDataStore.VoiceChatControlData.SetVoiceChannel(VoiceChannel.Lobby); 37 Debug.Log($"Voice Channel : {VoiceChannel.Lobby}"); 38 } 39 40 // Change VoiceChannel to GameTeam1 41 if (Keyboard.current.digit2Key.wasPressedThisFrame) 42 { 43 _voiceChatControlDataStore.VoiceChatControlData.SetVoiceChannel(VoiceChannel.GameTeam1); 44 Debug.Log($"Voice Channel : {VoiceChannel.GameTeam1}"); 45 } 46 47 // Change VoiceChannel to GameTeam2 48 if (Keyboard.current.digit3Key.wasPressedThisFrame) 49 { 50 _voiceChatControlDataStore.VoiceChatControlData.SetVoiceChannel(VoiceChannel.GameTeam2); 51 Debug.Log($"Voice Channel : {VoiceChannel.GameTeam2}"); 52 } 53#endif 54 } 55}

ボイスチャンネルの定義

C#

1public enum VoiceChannel 2{ 3 Lobby = 0, 4 GameTeam1 = 1, 5 GameTeam2 = 2, 6} 7

試したこと

その1
参考にしたリンクの【Unity/Photon Voice2】ボイスチャットの実装(ルーム・チャンネルを分けて)を参考にボイスチャンネルの切り替えをするコードを作成しました。
バージョンが変更され、VoiceNetworkからPunVoiceClientへ名前が変更され、FusionではFusionVoiceClientがVoiceNetworkにあたることが分かりました。

その2
_fusionVoiceClient.Client.OpChangeGroups(remove, add) で返ってきた結果を出力しました。
結果はTrueでした。

その3
Recorder の Interest Group をインスペクターから0に変更すると音声が聞こえました。
このため、送信する側のチャンネルのみが変更され、受信側のチャンネルは変更されていないと推測しました。

その4
公式のリファレンスや実際のソースコードを見たりしながら、VoiceConnection.Client.OpChangeGroupでチャンネルを変更できること、FusionVoiceClientVoiceConnectionを継承しているのでFusionVoiceClient.Client.OpChangeGroupと扱えばよさそうだと推測しました。

補足情報(FW/ツールのバージョンなど)

環境
Unity 2021.3.11f1
UniRx Ver 7.1.0
VContainer v1.13.2
Photon Fusion 1.1.8
Photon Voice v2.52

参考にしたリンク
【Unity/Photon Voice2】ボイスチャットの実装(ルーム・チャンネルを分けて)
https://qiita.com/konbraphat51/items/e1155f5f4a5c5c5149e1
Recorderコンポーネント | Photon Engine
https://doc.photonengine.com/ja-jp/voice/current/getting-started/recorder#6mld31bqzn1pqqeg
【Unity】PhotonFusion + PhotonVoice2 導入方法【ボイスチャット】
https://qiita.com/Cova8bitdot/items/d19ce607d6a3933c2000
Need help using Audio/Interest Groups.
https://photon346.rssing.com/chan-63555341/article352.html

似たようにチャンネルが変更できない際にこのように対応したら解決したなどの情報を頂ければ幸いです。
また、こうしてネットで質問するのは初めてなので何か足りない情報など要望があればできる限り記載したいと思います。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

原因

Fusion 側でInterest Group を使うためのセットアップができていなかったようです。

解決方法

Unity上部のFusion --> Network Project Config で設定を開き、インスペクターから Config --> Simulation --> Replication Mode を Delta Snapshots から Eventual Consistency に変更する。

参考リンク

インタレストマネジメント | Photon Engine
https://doc.photonengine.com/ja-jp/fusion/current/manual/interest-management

投稿2023/10/13 05:31

hosoken1

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問