使用语音聊天功能
Zepeto.Voice.Chat 预览版本包启用世界中的语音聊天。
1) 安装 Window → 包管理器 → ZEPETO.Voice.Chat。
- 此功能在实现了多人元素的世界中可用。
- 测试仅在移动测试中可用,而不在编辑器测试中可用。
- 由于 iOS 政策,在启用语音聊天的世界中,打开麦克风时设备音量不会降至零。 关闭麦克风时,设备音量将降至零。
2) 点击正在开发的 Unity 项目屏幕中间菜单的 [▼] 按钮。 在弹出菜单中点击 [打开世界设置] 按钮。
3) 如果正确安装了 ZEPETO.Voice.Chat 包,您将看到添加的语音聊天模式选项。
4) 在语音聊天模式中,请设置所需的模式。
- 基本:使用默认提供的语音聊天功能。
- 脚本:通过实现语音聊天 API 使用语音聊天功能。
- 您可以在运行时处理语音聊天的房间访问进出。
- 为不同团队实现语音聊天(例如,红队语音聊天和蓝队语音聊天)
- 检测当前说话的用户
一个拥有基本模式语音聊天的世界看起来是这样的。
您还可以使用语音调制功能创建更有趣的语音聊天。
进入具有语音聊天功能的世界时,语音聊天会自动启用。
👍 第一次在ZEPETO中使用语音聊天功能时,会出现关于麦克风访问的弹出窗口。 您必须允许访问才能使用语音聊天功能。
- 在 ZEPETO 应用程序 3.26.000 及以上版本中,语音聊天扬声器图标不显示。
- 如果您想让语音图标显示,请切换到脚本模式并按照指南编写自己的代码。
脚本模式在团队分隔的频道中启用语音聊天。
请参考下面的功能描述和示例来实现该功能。
API | 描述 |
---|---|
OnInitializedEvent | 在初始化事件中,当发生True事件时,语音聊天API可用。 如果此事件为True,则语音聊天可用;如果为False,则语音聊天不可用。 |
EnterRoom(RoomProperty roomProperty) | 进入语音聊天房间的功能 - 成功进入语音聊天房间后,语音聊天按钮将出现 |
ExitRoom() | 离开语音聊天房间的功能 |
OnRoomConnectedEvent | 检查进入语音聊天房间状态的事件。 如果此事件为真,则用户已进入语音聊天房间;如果为假,则用户已离开语音聊天房间。 |
OnSpeechDetectedEvent<string, boolean> | 检测当前在语音聊天中说话的用户的事件。 - string是说话用户的userId - boolean在发言开始时为true,在发言结束时为false |
ChangeTeamID(number teamid) | 更改语音聊天房间中使用的TeamId的功能 - 只能设置为1或更大的整数值 |
API | 描述 |
---|---|
SetAudioMode | 在语音聊天中使用的音频模式 - AudioMode.Omnidirectional: 语音聊天模式,不基于距离进行语音衰减 (您可以与或不与ZEPETO角色一起使用) - AudioMode.Directional: 语音聊天模式,基于距离进行语音衰减 (ZEPETO角色必须存在于场景中,因为此模式基于ZEPETO角色的位置) |
SetTeamID | 在语音聊天中使用的TeamId,以启用具有相同TeamId的用户之间的语音聊天。 - 只能设置为1或更高的整数值 |
这里有一些示例代码来尝试语音聊天API。
1) 添加一个按钮并将文本记录到画布上,如下图所示,以进入语音聊天团队频道并显示状态日志。
- 按钮
- 按钮_蓝队 : 蓝队语音聊天入口按钮
- 按钮_红队 : 红队语音聊天入口按钮
- 按钮_退出 : 退出语音聊天按钮
- 文本
- 文本_日志 : 显示聊天日志的文本
- 文本_团队 : 显示同一语音聊天团队频道成员列表的文本
- 文本_当前发言 : 显示当前在语音聊天中发言的用户ID的文本。
2) 创建项目 > 创建 > ZEPETO > TypeScript 并将其重命名为 VoiceChatTest。
3) 编写如下示例脚本。
- 代码描述
- 当脚本运行时,它将在 Start() 函数中为每个按钮注册一个事件,并在 VoiceChatController 上注册 OnInitialized、OnRoomConnected 和 OnSpeechDetected 事件。
- 当点击蓝队按钮或红队按钮时,将执行 EnterVoiceChatRoom() 函数,用户通过输入指定的 RoomProperty 进入语音聊天房间。示例中的房间属性如下。
- roomProperty.SetAudioMode : AudioMode.Omnidirectional。Omnidirectional 音频模式是一个无论玩家位置如何音量都相同的模式。相比之下,Directional 模式是一个 3D 声音模式,这意味着音量会根据角色的位置而有所不同,因此角色离得越远,音量就会越小。
- roomProperty.SetTeamID : 蓝队为频道 2,红队为频道 3。SetTeamID 在语音聊天中充当频道。进入频道 2 的团队只能与频道 2 中的玩家进行语音聊天,而进入频道 3 的团队只能与频道 3 中的玩家进行语音聊天。
- ExitVoiceChatRoom() 将退出当前的语音聊天团队频道。
- OnSpeechDetected() 将输出当前在团队频道中使用语音聊天的玩家 ID 到日志文本中。
4) 完成脚本后,在检查器中分配步骤 1 中创建的按钮和文本。
5) 通过二维码或测试链接在移动设备上运行测试,您可以看到在按下“进入团队”按钮时创建了语音聊天激活按钮,并且每当玩家说话时,日志会显示哪个玩家在语音聊天中,如下屏幕所示。
在ZEPETO App 3.26.000及更高版本中,语音聊天发言图标不显示。 如果您想处理发言图标的显示,请遵循指南并编写自己的代码。
1) 当玩家在语音聊天中时,要在角色头上显示气泡,您需要创建一个使用气泡图像的预制件。导入您想使用的气泡PNG图像,如下所示,并将其纹理类型更改为Sprite。
2) 项目 > 创建 > 预制件,并将其重命名为ChatBubble。
3) 双击ChatBubble预制件以进入预制件编辑模式。选择ChatBubble预制件并选择变换 > 位置 > 将Y值更改为0.35。
4) 在预制对象内创建一个画布。
- 双击 ChatBubble 预制件以进入预制编辑模式,然后添加层级 > UI > 画布。
- 将画布的 RectTransform 组件的值更改为以下内容
- PosX: 0 , posY: 0
- 宽度: 100, 高度: 100
- 缩放X: 0.005, 缩放Y: 0.005, 缩放Z: 0.005
- 将画布组件的 RenderMove 更改为世界空间。
5) 在画布内创建一个对话气泡图像。
- 将层级 > UI > 图像添加为画布的子项,并将其重命名为 ChatBubbleImage。
- 将 ChatBubbleImage 的 RectTransform 组件的值更改为以下内容
- 宽度 42, 高度:42
- 将您在第 1 步中导入的图像精灵注册为图像组件中的源图像。
👍 提示
- 您还可以为气泡图像精灵添加动画效果。
- 您还可以为不同的团队使用单独的气泡图像。
6) 项目 > 创建 > ZEPETO > 创建一个 TypeScript 并将其重命名为 VoiceChatBubbleController。
7) 编写如下所示的示例脚本。
- 代码描述
- 当脚本执行时,它将在Start()函数中注册每个按钮的事件,并在VoiceChatController的OnInitialized、OnRoomConnected和OnSpeechDetected事件中注册事件。
- 在OnInitialized()之后,当玩家进入世界时,语音聊天按钮将显示在玩家的屏幕上,当他们按下按钮时,将执行EnterVoiceChatRoom()以进入语音聊天房间。
- 每当玩家激活语音聊天并说话时,OnSpeechDetected()将被执行,如果speechDetected为true,则启用BubbleChat对象,如果为false,则禁用它。
- 第一次激活OnSpeechDetected()函数时,CreateVoiceBubble()将实例化一个voiceChatPrefab游戏对象,漂浮在玩家的头顶,并将其注册为_map数据。
- 我们使用LateUpdate()每帧更新语音聊天气泡的旋转,以匹配ZEPETO世界的CameraParent。这确保了气泡图像始终面向相机。它首先检查_voiceBubbleMap是否为空,否则更新气泡图像预制件的旋转。
8) 完成脚本编写后,在检查器中将VoiceChatPrefab条目分配为您在步骤1中创建的气泡预制件。
9) 通过二维码或测试链接在移动设备上运行,您应该会看到每当玩家使用语音聊天时,气泡图像出现在角色的头顶。
从语音聊天版本 0.2.1-preview 开始,您可以在脚本模式下调节语音聊天的声音。
使用 API 指南和示例代码尝试语音调制。
语音类型 (枚举) | 值 | 描述 |
---|---|---|
类型00 | 0 | 原始 |
类型01 | 1 | 小松鼠 |
类型02 | 2 | 叔叔 |
类型03 | 3 | 回声 |
类型04 | 4 | 低音 |
类型05 | 5 | 机器人 |
类型06 | 6 | 方言 |
类型07 | 7 | 扩音器 |
类型08 | 8 | 野兽 |
类型09 | 9 | 机器 |
类型10 | 10 | 强流 |
类型11 | 11 | 孩子 |
类型12 | 12 | 刺猬 |
这是一个声音调节的示例脚本。
- 代码描述:
- 为每个按钮添加一个 onClick 监听器,以设置不同的语音调制类型。
- 相同索引的元素在按钮数组和语音类型数组中是匹配的。
- 进入世界时,VoiceChatController 被初始化,并且房间连接会自动建立。
- 初始语音调制类型设置为Type00,并启用回音以听到自己的声音。
- 请注意,调用SetVoiceType 和EnableLoopback时,需要房间连接。因此,初始设置在OnRoomConnectedEvent的监听器中处理。
您可以使用 VoiceChatController.SetLocalPlayerTransform().
使用此功能,您可以通过将您的位置设置为特定空间或物体位置来创建各种场景,在语音聊天中进行交流。
📘 提示 语音聊天的变换与本地玩家的ZEPETO角色变换相关联。
因此,如果本地玩家的ZEPETO角色尚未在世界中创建,您的声音可能无法传输。
在这种情况下,您可以通过在当前场景中设置语音播放位置来使用语音聊天,使用 SetLocalPlayerTransform().
API | 描述 |
---|---|
public static SetLocalPlayerTransform($transform: UnityEngine.Transform):void | 更改本地玩家音频播放位置的功能 |
❗️ 注意 SetLocalPlayerTransform() 必须在语音聊天初始化后某个时间调用 VoiceChatController.OnInitializedEvent(true)。
1) 以下是语音位置更改功能的示例脚本。
代码描述
- 当场景开始时,在 Start() 函数中创建一个名为 voiceTransformObject 的游戏对象,并在 voiceTransform 中注册 Transform。
- 当语音聊天 OnInitialized 监听器被调用时,请应用以下设置:
- 通过 SetAudioMode(AudioMode.Directional) 将语音聊天设置为 3D 空间音频模式。
- 通过 VoiceChatController.SetLocalPlayerTransform() 将本地玩家的语音聊天位置设置为 voiceTransform。
- buttonCloserTransform 在按钮被点击时将 voiceTransform 的位置设置为原点 (0, 0, 0)。
- buttonFartherTransform 在按钮被点击时将 voiceTransform 的位置设置为 (10, 0, 0)。
2) 将场景中的 Canvas 上的按钮注册到 VoiceTransformSample 组件的 buttonCloserTransform 和 buttonFartherTransform。
3) 如果您使用二维码或测试链接在手机上运行它,您可以检查以下内容。
- 当您按下更近按钮时,您的声音会听起来更接近其他人。
- 当您按下更远按钮时,您的声音会被听到得离其他人很远。