介绍

本文介绍Unity中的语音聊天,想分离频道。

这是一个示例项目。
https://github.com/konbraphat51/PhotonVoiceChannelSperated
细节与本文不同,但主要故事大致相同。
Photon ID 为空白,因此请获取并注册后述的两种 ID。

Photon Voice 已经看到一些旧文章实现发生故障的情况,本文可能会随着时间的推移而恶化。这篇文章是2022 年 8 月请认准它是一个成功的例子

介绍光子语音 2

资产商店在这里请从安装
如果有人做过Photon,为什么不也介绍PUN2呢?因为 Photon voice 2 也包含 PUN2不要混合 PUN2。 官方的也这么说。

光子注册

Photon 是一个服务器服务,所以你必须注册你的应用程序。
光子页面实时语音用户注册两个应用请注册

光子设置

您可以从 Unity 屏幕顶部的 Window->Photon Unity Networking->Highlight Server Settings 访问 Unity 端的 Photon 设置。
【Unity/Photon Voice2】ボイスチャットの実装(ルーム・チャンネルを分けて)

App ID PUN 实时应用 ID,
将语音应用 ID 复制并粘贴到 App ID Voice
Fixed Region 更改为 jp 是标准的。

现在要做什么

让我们继续实际的实现。
至于机制,首先
・光子管理器
・语音管理器
·扬声器
共有三个对象

PunManager 负责最初连接到服务器。

VoiceManager 在屏幕前录制您的声音,并通过网络将其发送给其他扬声器。

扬声器发出实际接收到的声音。请注意,最初(执行之前)没有扬声器。它将采用预制件的形式,Photon 将实例化它。

管理器

将下面的脚本附加到一个空对象。
我使用@UpAllNight 的超级通俗易懂的文章作为一般流程的参考。

PunManager.cs
using UnityEngine;
using System.Collections;
using Photon.Pun;
using Photon.Realtime;

public class PunManager : MonoBehaviourPunCallbacks
{
    void Start()
    {
        PhotonNetwork.ConnectUsingSettings();
    }

    void OnGUI()
    {
        GUILayout.Label(PhotonNetwork.NetworkClientState.ToString());
    }

    public override void OnConnectedToMaster()
    {
        PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions(), TypedLobby.Default);
    }

    //ルームに入室後に呼び出される
    public override void OnJoinedRoom()
    {
        PhotonNetwork.Instantiate("Speaker", Vector3.zero, Quaternion.identity, 0);
    }
}

多亏了这一点,它将首先连接到服务器并生成一个扬声器(见下文)。

扬声器对象

Speaker Photon Voice View 附加到空对象。然后Audio Souce会在未经许可的情况下添加,但请不要删除。
如果你像下图那样设置它,你应该没问题。
【Unity/Photon Voice2】ボイスチャットの実装(ルーム・チャンネルを分けて)
将其设为预制件并将预制件名称设置为“扬声器”
将其保存在资产 -> 光子 -> 资源中。
这里的原理在这篇文章中很容易理解。

语音管理器

Photon Voice NetWork Recorder 组件附加到空对象。
【Unity/Photon Voice2】ボイスチャットの実装(ルーム・チャンネルを分けて)
试试这样设置。该图像是 Player 预制件,但请将您之前制作的扬声器附加到 Speaker Prefab。
顺便说一句,我被卡住了,因为我没有检查 Transmit Enable。

第一步(不分房)完成

这是完成的第一步。如果你将它构建为测试并同时运行两者,你会发现返回的是你自己的麦克风的声音。

渠道划分功能的实现

我们距离根据团队隶属关系拆分频道并为每个团队创建单独的语音聊天仅一步之遥。
尝试将以下脚本附加到 VoiceManager。

VoiceTeamSwitch.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Voice.PUN;
using Photon.Voice.Unity;

public class VoiceTeamSwitch : MonoBehaviour
{
    PhotonVoiceNetwork voiceNetwork;
    Recorder recorder;
    // Start is called before the first frame update
    void Start()
    {
        voiceNetwork = GetComponent<PhotonVoiceNetwork>();
        recorder = GetComponent<Recorder>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            byte[] remove = new byte[0];
            byte[] add = new byte[] { 1 };
            //チャンネル変更部分
            voiceNetwork.Client.OpChangeGroups(remove, add);
            recorder.InterestGroup = 1;
            //チャンネル変更部分ここまで
            Debug.Log(1);
        }
        if (Input.GetKeyDown(KeyCode.W))
        {
            byte[] remove = new byte[0];
            byte[] add = new byte[] { 2 };
            voiceNetwork.Client.OpChangeGroups(remove, add);
            recorder.InterestGroup = 2;
            Debug.Log(2);
        }
    }
}

在上面的代码中,按 Q 键切换到通道 1,按 W 键切换到通道 2。
注意默认是通道0,“每个人”都能听到通道 0.因此,如果您不想听到其他通道的声音,您必须先将它们从通道 0 中移除。

再次,
voiceNetwork.Client.OpChangeGroups(remove, add) 是“接收”的渠道
recorder.InterestGroup 是“发送”的频道
是。
“发送”只有一个通道,但“接收”可以是多个通道。
第一个参数指定要离开的频道,第二个参数指定要加入的频道。
如果在此处指定 byte[0],则可以从“所有频道”退出/加入
如果你做空,那将是“什么都不做”。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622608.html

相关文章:

  • 2022-12-23
  • 2022-01-16
  • 2021-06-23
  • 2021-07-17
  • 2021-11-19
  • 2021-11-29
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2021-07-11
  • 1970-01-01
  • 2021-07-24
  • 2021-04-09
相关资源
相似解决方案