Dynamic Audio group
動態音訊群
動態音訊群功能允許與所有本機使用者周圍的遠端使用者來進行討論,而不需要使用頻寬或新增來自遠處的使用者的噪音。
聽不到在定義的距離之外的使用者的聲音。
加上適當的聲音空間化及衰減,這提供一種自然的聆聽感受。
目前的執行方式是基於Photon聲音興趣群。
各個使用者將在一個獨一無二的興趣群中發言,並且這將不會被改變。
然而,他所接聽的群的清單,是根據限制所需頻寬的其他玩家的接近程度來被動態地調整。
進一步而言,被隔離的人不會透過網路發送他們的聲音,來進一步避免耗用頻寬。
這個功能仰賴於DynamicAudioGroupMember
類別。
動態音訊群成員
DynamicAudioGroupMember
位於各個網路玩家預製件上
在Spawned()
中,針對玩家來計算一個獨一無二的音訊GroupId
(換句話說,各個玩家有其自己的GroupId
)。
然後以這個GroupId
來設置本機玩家Recorder
音訊興趣群,並且設置聲音客戶端來接聽它。
C#
async void SpeakAndListenOnlyToGroup(byte groupId)
{
...
recorder.InterestGroup = groupId;
fusionVoiceClient.Client.OpChangeGroups(groupsToRemove: new byte[] { }, groupsToAdd: new byte[] { groupId });
...
}
為了更新玩家接聽的群,我們檢查其他玩家是否在Update()
期間位於定義的距離之內。
C#
private void Update()
{
CheckProximity();
}
針對在距離內找到的各個玩家,本機玩家開始接聽遠端玩家的GroupId
(GroupId
是一個已連網變數)。
C#
private void CheckProximity()
{
...
if(DistanceSqr(member) < proximityDistanceSqr)
{
...
ListentoGroupId(member.GroupId);
}
...
}
C#
async void ListentoGroupId(byte groupId)
{
if (!Object.HasStateAuthority) return;
while (!IsPhotonVoiceready || !isSpeakInitialized) await Task.Delay(10);
fusionVoiceClient.Client.OpChangeGroups(groupsToRemove: null, groupsToAdd: new byte[] { groupId });
}
相反地,如果一個遠端玩家不再在距離周界之中,那麼將利用StopListeningToGroupId()
方法來不再接聽他。
因為這些操作都是由全部玩家執行的,因此雙向的交流是可行的,雖然各個玩家只在他自己的GroupId
中發送他的聲音。
同時,因為玩家可能很靠近另一個玩家,但是卻是在不同的已關閉房間中,CheckProximity()
檢查成員是否應該在房間被隔離的情況下停止接聽另一個成員(當一個使用者在一個隔離的房間時,在AudioRoomMember
中設定additionalGroupFilter
參數)。
C#
if(additionalGroupFilter != member.additionalGroupFilter)
{
// No matching filter
StopListeningToMember(member);
}
示範
為了描繪用途,在Assets\Photon\FusionAddons\DynamicAudioGroup\Demo\Scenes\DynamicAudioGroup.unity
中可以找到一個示範場景。
連線多個客戶端並且觀察與各個玩家關聯的資訊面板。
各個玩家由兩個半球所包圍。
綠色半球是在另一個玩家的頭進入時將開始接聽他的區域。
接聽將在頭離開紅色半球時停止。
相依性
- Photon Voice SDK
下載
這個附加元件的最新版本被包含在附加元件專案之中
已支援拓撲
- 共享模式
更改記錄
- 版本2.0.0:支援Fusion 2.0
- 版本1.0.2:在已接聽成員中斷連線時,修正顯示動態音訊群資訊中的錯誤
- 版本1.0.1:新增示範場景+新增命名空間
- 版本1.0.0:第一個版本