実現したいこと
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
でチャンネルを変更できること、FusionVoiceClient
はVoiceConnection
を継承しているので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
似たようにチャンネルが変更できない際にこのように対応したら解決したなどの情報を頂ければ幸いです。
また、こうしてネットで質問するのは初めてなので何か足りない情報など要望があればできる限り記載したいと思います。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。