diff --git "a/markdown/metachat/guide/ Android/\345\256\236\346\227\266\345\205\261\350\265\217\345\275\261\351\237\263 Android.md" "b/markdown/metachat/guide/ Android/\345\256\236\346\227\266\345\205\261\350\265\217\345\275\261\351\237\263 Android.md" deleted file mode 100644 index 3ea47861d94..00000000000 --- "a/markdown/metachat/guide/ Android/\345\256\236\346\227\266\345\205\261\350\265\217\345\275\261\351\237\263 Android.md" +++ /dev/null @@ -1,50 +0,0 @@ -本文介绍如何在元宇宙中实现多用户共同观看电影、聆听音乐和 K 歌。 - -用户可以在虚拟环境中与异地好友体验共享观影、听歌、唱歌的乐趣。不同用户看到视频、听到音乐几乎是同时的,用户间的互动也是几乎没有延迟。虚拟环境可以设置为电影院等娱乐场所,用户可以随时暂停视频,与其他用户进行实时交流互动,从而更好地享受在线互动的乐趣。实时共赏影音功能可以增加元语聊场景的多样性,为在线互动提供更真实的体验。 - - -![](https://web-cdn.agora.io/docs-files/1679563308898) -![](https://web-cdn.agora.io/docs-files/1679563317645) - -## 技术原理 - -![](https://web-cdn.agora.io/docs-files/1679564236130) //TODO 需要更新图片 - -在一起看电影、听音乐的功能实现中,主播通过媒体播放器控制音视频的播放。媒体播放器将视频推送至元宇宙中的视频显示屏,所有用户都可以通过显示屏观看视频内容。同时,主播发布麦克风采集的音频和播放器的音乐,观众或听众可以订阅这些音频。从而达到一起看电影、一起听音乐的效果。 - -在一起 K 歌的功能实现中,你还需添加在线 K 歌房的代码逻辑,并将元宇宙中的视频显示屏当成 K 歌房的歌词组件,向用户展示 K 歌界面,用户可以跟随主唱一起唱歌。 - -## 示例项目 - -声网在 GitHub 上提供开源 [Agora-MetaChat](https://github.com/AgoraIO-Community/Agora-MetaChat/tree/dev_sdk2) 示例项目供你参考使用。如果你还需了解 Unity 部分的工程文件和功能指南,请联系 sales@agora.io 获取。 - - -## 前提条件 - -实现实时共赏影音功能前,请确保你已实现基础的元语聊功能,如创建、进入 3D 场景、创建虚拟形象。详见[客户端实现](https://docs.agora.io/cn/metachat/metachat_client_android?platform=All%20Platforms)。 - -## 实现步骤 - -下图展示 API 调用时序: - -![](https://web-cdn.agora.io/docs-files/1679996687853) - -### 1. 推送视频 - -调用 [`enableVideoDisplay`](https://docs.agora.io/cn/metachat/metachat_api_android?platform=All%20Platforms#enablevideodisplay) 开启元宇宙中的视频显示屏,再通过 [`pushVideoFrameToDisplay`](https://docs.agora.io/cn/metachat/metachat_api_android?platform=All%20Platforms#pushvideoframetodisplay) 将你从媒体播放器 onFrame 回调得到的视频帧推送至该视频显示屏。 - -```java -// 开启视频显示屏 -// "1" 为指定的 displayID -metaChatScene.enableVideoDisplay("1", true); -// 将媒体播放器 onFrame 回调视频帧推送至指定的视频显示屏上 -metaChatScene.pushVideoFrameToDisplay("1", frame); -``` - -### 2. 同步视频播放进度 - -为了同步主播和观众的视频播放进度,主播调用 [`sendStreamMessage`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_stream_management.html#api_irtcengine_sendstreammessage) 发布携带播放进度的数据流,观众通过 [`onStreamMessage`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/v4.1.1/API/toc_network.html#callback_irtcengineeventhandler_onstreammessage) 接收数据流,解析出播放进度。 - -```java -public abstract int sendStreamMessage(int streamId, byte[] message); -``` \ No newline at end of file diff --git "a/markdown/metachat/guide/ Android/\346\215\242\350\243\205\345\222\214\346\215\217\350\204\270 Android.md" "b/markdown/metachat/guide/ Android/\346\215\242\350\243\205\345\222\214\346\215\217\350\204\270 Android.md" deleted file mode 100644 index b2d04a38a08..00000000000 --- "a/markdown/metachat/guide/ Android/\346\215\242\350\243\205\345\222\214\346\215\217\350\204\270 Android.md" +++ /dev/null @@ -1,64 +0,0 @@ -在虚拟场景中,塑造一个独一无二的虚拟形象是进入场景的第一步。元语聊支持导入自定义人物素材模型,并支持换装和捏脸功能。本文介绍如何在元语聊中实现对虚拟形象的换装和捏脸。 - -## 示例项目 - -声网在 GitHub 上提供开源 [Agora-MetaChat](https://github.com/AgoraIO-Community/Agora-MetaChat/tree/dev_sdk2) 示例项目供你参考使用。如果你还需了解 Unity 部分的工程文件和功能指南,请联系 sales@agora.io 获取。 - - -## 前提条件 - -实现换装和捏脸前,请确保你已实现基础的元语聊功能,如创建、进入 3D 场景、创建虚拟形象。详见[客户端实现](https://docs.agora.io/cn/metachat/metachat_client_android?platform=All%20Platforms)。 - - -## 实现步骤 - -本节展示如何实现换装,内容以 Native 部分的开发为主,Unity 部分的开发请参考 Unity 工程文件和功能指南。捏脸的功能实现也请参考 Unity 工程文件。 - -下图展示 API 调用时序: - -![](https://web-cdn.agora.io/docs-files/1680172657171) - -### 1. 更换装扮 - -建议在业务逻辑中包含多个场景的情况下,调用 [`enterScene`](https://docs.agora.io/cn/metachat/metachat_api_android?platform=All%20Platforms#enterscene) 时使用 `EnterSceneConfig` 中的 `mExtraCustomInfo` 来设置 `sceneIndex`,以便区分不同的场景。Unity 场景脚本可以根据 `sceneIndex` 来确定进入哪个场景,并执行相应的逻辑。 - -在这种情况下,我们将 `sceneIndex` 设置为“换装”场景,这些场景只包含待更换装扮的用户,没有其他用户。因此,在这些场景中,只需要更换装扮。你可以通过 `IMetachatScene` 的 [`sendMessageToScene`](https://docs.agora.io/cn/metachat/metachat_api_android?platform=All%20Platforms#sendmessagetoscene) 方法向 Unity 场景发送自定义的换装消息。Unity 场景脚本可以处理对应的自定义消息,实现人物装扮的更换。 - -```java -// 本节代码展示换装的逻辑 -// 自定义 UnityMessage 实体类 -// UnityMessage 包含 key 和 value 属性 -UnityMessage message = new UnityMessage(); -// 设置 key -message.setKey("dressSetting"); -// 设置 value -message.setValue(JSONObject.toJSONString(getUnityRoleInfo())); -// 将 UnityMessage 实体类转换成 JSON 字符串 -String msg = JSONObject.toJSONString(message); - -// 将 UnityMessage 字符串转换成字节数组并发送到场景中 -metaChatScene.sendMessageToScene(msg.getBytes()); -``` - -### 2. 同步装扮 - -更换人物装扮后,如果用户进入其他场景并需要让其他用户看到新形象,则需要同步更换的装扮信息。你可以通过 `ILocalUserAvatar` 的 [`setDressInfo`](https://docs.agora.io/cn/metachat/metachat_api_android?platform=All%20Platforms#setdressinfo) 方法让 SDK 将更新后的形象同步给场景中的其他用户。 - - -```java -// 本节代码展示同步装扮的逻辑 -// 设置用户信息 -localUserAvatar.setUserInfo(userInfo); -// 设置本地用户的模型信息 -// model 对应的资源包类型为 2(BUNDLE_TYPE_AVATAR) -localUserAvatar.setModelInfo(modelInfo); -if (null != roleInfo) { - DressInfo dressInfo = new DressInfo(); - // mExtraCustomInfo 是额外的自定义信息 - // getUnityRoleInfo 代表 Unity 场景的角色信息 - // 将 mExtraCustomInfo 设置为 getUnityRoleInfo 方法获取的 JSON 字节数组 - dressInfo.mExtraCustomInfo = (JSONObject.toJSONString(getUnityRoleInfo())).getBytes(); - // 设置本地用户的服装信息 - localUserAvatar.setDressInfo(dressInfo); -} -``` \ No newline at end of file diff --git "a/markdown/metachat/guide/ Android/\347\251\272\351\227\264\351\237\263\346\225\210 Android.md" "b/markdown/metachat/guide/ Android/\347\251\272\351\227\264\351\237\263\346\225\210 Android.md" deleted file mode 100644 index 9d4bd66cb28..00000000000 --- "a/markdown/metachat/guide/ Android/\347\251\272\351\227\264\351\237\263\346\225\210 Android.md" +++ /dev/null @@ -1,177 +0,0 @@ -本文介绍如何使用空间音效功能以增强元宇宙音频体验。 - -在元宇宙中,空间音效可以为用户带来更加真实、身临其境的虚拟体验。例如,在一个虚拟的 3D 旅游场景中,空间音效可以让用户宛如身临其境般听到旅游中路人聊天声、海浪声、风声,让用户更沉浸式体验。 - -![](https://web-cdn.agora.io/docs-files/1679566933312) - -## 技术原理 - -空间音效功能基于声学原理,模拟声音在不同空间环境中的传播、反射、吸收效果。通过在不同位置放置音源和听众,模拟现实中的声音传播效果,使得听众可以听到更真实自然的声音。 - - -结合 `IMetachatSceneEventHandler` 提供的用户位置信息回调和 `ILocalSpatialAudioEngine` 提供的空间音效系列方法,你可以实现带空间音效的元语聊。 - -## 示例项目 - -声网在 GitHub 上提供开源 [Agora-MetaChat](https://github.com/AgoraIO-Community/Agora-MetaChat/tree/dev_sdk2) 示例项目供你参考使用。如果你还需了解 Unity 部分的工程文件和功能指南,请联系 sales@agora.io 获取。 - - - -## 前提条件 - - -实现空间音效前,请确保你已实现基础的元语聊功能,如创建、进入 3D 场景、创建虚拟形象。详见[客户端实现](https://docs.agora.io/cn/metachat/metachat_client_android?platform=All%20Platforms)。 - - -## 实现步骤 - -用户在元宇宙中听到的声音分为两类: - -- 远端用户的音频 -- 本地媒体播放器播放的音频 - -因此,实现空间音效时,你需要按照如下步骤对两种音频都进行处理。 - -### 用户空间音效 - -下图介绍实现用户空间音效的 API 时序: - -![](https://web-cdn.agora.io/docs-files/1679996706613) - - -#### 1. 创建和初始化空间音效引擎 - -使用空间音效前,你需要调用 [`create`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/v4.1.1/API/toc_audio_effect.html#api_ilocalspatialaudioengine_create) 和 [`initialize`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_audio_effect.html#api_ilocalspatialaudioengine_initialize) 创建和初始化空间音效引擎。 - -**注意**:请在加入 RTC 频道前调用。 - -```java -// 创建和初始化空间音效引擎 -spatialAudioEngine = ILocalSpatialAudioEngine.create(); -LocalSpatialAudioConfig config = new LocalSpatialAudioConfig() {{ - mRtcEngine = rtcEngine; -}}; -spatialAudioEngine.initialize(config); -``` - - -#### 2.设置空间音效接收范围 - -调用 [`setAudioRecvRange`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_audio_effect.html?platform=Android#api_ibasespatialaudioengine_setaudiorecvrange) 设置空间音效接收范围,当远端用户相对本地用户的距离超出这个范围,本地用户就会听不到远端用户的声音。 - -当使用空间音效时,请确保在 `RtcEngine` 中将音频流的发布和订阅都设置为 `mute`,即停止发布和订阅音频流。在后续的逻辑中,应由 `ILocalSpatialAudioEngine` 处理是否停止发布和订阅音频流。 - -```java -// 设置空间音效的音频接收范围 -// 如果超过设置的值,那么本地用户听不见远端用户的声音 -spatialAudioEngine.setAudioRecvRange(100); -// ILocalSpatialAudioEngine 设置恢复发布本地音频流 -// 此时需要额外检查本地用户角色不是观众,否则无法发流 -spatialAudioEngine.muteLocalAudioStream(false); -// ILocalSpatialAudioEngine 设置恢复订阅所有远端音频流 -spatialAudioEngine.muteAllRemoteAudioStreams(false); -``` - - -#### 3. 处理用户位置变化 - -通过 [`onUserPositionChanged`](https://docs.agora.io/cn/metachat/metachat_api_android?platform=All%20Platforms#onuserpositionchanged) 回调监听用户的位置变化。如果当前用户是本地用户,调用 [`updateSelfPosition`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_audio_effect.html#api_ibasespatialaudioengine_updateselfposition) 更新本地用户位置信息;如果当前用户是远端用户,调用 [`updateRemotePosition`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_audio_effect.html#api_ilocalspatialaudioengine_updateremoteposition) 更新远端用户的信息位置。 - -**注意**:请在加入 RTC 频道后监听和处理用户位置变化。 - -```java -// 处理用户位置的变化 -@Override -public void onUserPositionChanged(String uid, MetachatUserPositionInfo posInfo) { - Log.d(TAG, String.format("onUserPositionChanged %s %s %s %s %s", uid, - Arrays.toString(posInfo.mPosition), - Arrays.toString(posInfo.mForward), - Arrays.toString(posInfo.mRight), - Arrays.toString(posInfo.mUp) - )); - - if (spatialAudioEngine != null) { - try { - int userId = Integer.parseInt(uid); - // 如果当前用户是本地用户 - // 那么使用 updateSelfPosition 更新本地用户的位置信息 - // 否则使用 updateRemotePosition 更新远端用户的位置信息 - if (KeyCenter.RTC_UID == userId) { - spatialAudioEngine.updateSelfPosition( - posInfo.mPosition, posInfo.mForward, posInfo.mRight, posInfo.mUp - ); - } else { - spatialAudioEngine.updateRemotePosition(userId, new RemoteVoicePositionInfo() {{ - position = posInfo.mPosition; - forward = posInfo.mForward; - }}); - } - } catch (NumberFormatException e) { - e.printStackTrace(); - } - } -} -``` - -#### 4. 销毁空间音效引擎 - -不需要使用空间音效时,调用 [`destroy`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_audio_effect.html#api_ilocalspatialaudioengine_release) 销毁空间音效引擎。 - -**注意**:请在离开 RTC 频道后和销毁 RTC 引擎前调用 destroy。 - -```java -// 销毁空间音效引擎 -if (spatialAudioEngine != null) { - ILocalSpatialAudioEngine.destroy(); - spatialAudioEngine = null; -} -``` - - -### 音乐空间音效 - -下图介绍实现媒体播放器空间音效的 API 时序: - -![](https://web-cdn.agora.io/docs-files/1679996715949) - - -由于空间音效是基于人物的位置驱动,因此在进入 Unity 场景后,无论人物是否移动,都需要 Unity 脚本主动向 app 发送一次人物的位置信息。这样可以确保空间音效引擎始终基于最新的位置数据提供空间音效。 - -#### 1. 实现媒体播放器 - -参考[媒体播放器](https://docs.agora.io/cn/live-streaming-premium-4.x/media_player_android_ng?platform=Android)功能指南创建一个 `IMediaPlayer` 对象,然后打开、播放媒体资源。 - -```java -mRtcEngine = RtcEngine.create(config); -// 创建 IMediaPlayer 对象 -mediaPlayer = engine.createMediaPlayer(); -mediaPlayer.open(url, 0); -// 请确保在收到 PLAYER_STATE_OPEN_COMPLETED 后再调用 play -mediaPlayer.play(); -``` - -#### 2. 设置播放器空间音效 - -处理 Unity 场景的回调信息,解析得到物体的三维坐标位置和朝向,并将这些信息传入 [`updatePlayerPositionInfo`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_audio_effect.html#api_ibasespatialaudioengine_updateplayerpositioninfo) 方法,设置播放器的空间音效。 - -```java -// 处理 Unity 场景回调信息 -@Override -public void onRecvMessageFromScene(byte[] message) { - // 解析 message,得到物体在场景里面的位置信息,包含 position 和 forward - // position 是物体的三维坐标位置 - // forward 是物体朝向 - // 注意:message 协议格式需要由你们的 Unity 开发人员和 Native 开发人员协商规定 - ... - - // 创建 RemoteVoicePositionInfo 对象,设置位置和朝向信息 - RemoteVoicePositionInfo posInfo = new RemoteVoicePositionInfo(); - posInfo.position = pos; // pos 为解析得到的物体位置 - posInfo.forward = forward; // forward 为解析得到的物体朝向 - - // 设置播放器的空间音效 - spatialAudioEngine.updatePlayerPosition(mMediaPlayer.getMediaPlayerId(), posInfo); -} -``` - - diff --git "a/markdown/metachat/guide/ iOS/\345\256\236\346\227\266\345\205\261\350\265\217\345\275\261\351\237\263 iOS.md" "b/markdown/metachat/guide/ iOS/\345\256\236\346\227\266\345\205\261\350\265\217\345\275\261\351\237\263 iOS.md" deleted file mode 100644 index e277ab5d645..00000000000 --- "a/markdown/metachat/guide/ iOS/\345\256\236\346\227\266\345\205\261\350\265\217\345\275\261\351\237\263 iOS.md" +++ /dev/null @@ -1,61 +0,0 @@ -本文介绍如何在元宇宙中实现多用户共同观看电影、聆听音乐和 K 歌。 - -用户可以在虚拟环境中与异地好友体验共享观影、听歌、唱歌的乐趣。不同用户看到视频、听到音乐几乎是同时的,用户间的互动也是几乎没有延迟。虚拟环境可以设置为电影院等娱乐场所,用户可以随时暂停视频,与其他用户进行实时交流互动,从而更好地享受在线互动的乐趣。实时共赏影音功能可以增加元语聊场景的多样性,为在线互动提供更真实的体验。 - -![](https://web-cdn.agora.io/docs-files/1679563308898) -![](https://web-cdn.agora.io/docs-files/1679563317645) - -## 技术原理 - -![](https://web-cdn.agora.io/docs-files/1679564236130) //TODO 需要更新图片 - -在一起看电影、听音乐的功能实现中,主播通过媒体播放器控制音视频的播放。媒体播放器将视频推送至元宇宙中的视频显示屏,所有用户都可以通过显示屏观看视频内容。同时,主播发布麦克风采集的音频和播放器的音乐,观众或听众可以订阅这些音频。从而达到一起看电影、一起听音乐的效果。 - -在一起 K 歌的功能实现中,你还需添加在线 K 歌房的代码逻辑,并将元宇宙中的视频显示屏当成 K 歌房的歌词组件,向用户展示 K 歌界面,用户可以跟随主唱一起唱歌。 - -## 示例项目 - -声网在 GitHub 上提供开源 [Agora-MetaChat](https://github.com/AgoraIO-Community/Agora-MetaChat/tree/dev_sdk2) 示例项目供你参考使用。如果你还需了解 Unity 部分的工程文件和功能指南,请联系 sales@agora.io 获取。 - - -## 前提条件 - -实现实时共赏影音功能前,请确保你已实现基础的元语聊功能,如创建、进入 3D 场景、创建虚拟形象。详见[客户端实现](https://docs.agora.io/cn/metachat/metachat_client_ios?platform=All%20Platforms)。 - -## 实现步骤 - -下图展示 API 调用时序: - -![](https://web-cdn.agora.io/docs-files/1679996745637) - -### 1. 推送视频 - -调用 [`enableVideoDisplay`](https://docs.agora.io/cn/metachat/metachat_api_ios?platform=All%20Platforms#enablevideodisplay) 开启元宇宙中的视频显示屏,再通过 [`pushVideoFrameToDisplay`](https://docs.agora.io/cn/metachat/metachat_api_ios?platform=All%20Platforms#pushvideoframetodisplay) 将你从媒体播放器 [`didReceiveVideoFrame`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_video_observer.html?platform=iOS#callback_ivideoframeobserver_onframe) 回调得到的视频帧推送至该视频显示屏。 - -```swift -// 开启视频显示屏 -// "1" 为指定的 displayID -metachatScene?.enableVideoDisplay("1", enable: true) - -// vf 为待推送的视频帧 -let vf = AgoraVideoFrame() -// 格式为 I420 -vf.format = 1 -vf.strideInPixels = Int32(videoFrame.width) -vf.height = Int32(videoFrame.height) -vf.dataBuf = data - -// 将视频帧推送至指定的视频显示屏上 -metachatScene?.pushVideoFrame(toDisplay: "1", frame: vf) -``` - -### 2. 同步视频播放进度 - -为了同步主播和观众的视频播放进度,主播调用 [`sendStreamMessage`](https://docs-preprod.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_network.html#api_irtcengine_sendstreammessage) 发布携带播放进度的数据流,观众通过 [`receiveStreamMessageFromUid`](https://docs-preprod.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_stream_management.html#callback_irtcengineeventhandler_onstreammessage) 接收数据流,解析出播放进度。 - -```swift -func sendStreamMessage( - _ streamId: Int, - data: Data -) -> Int -``` \ No newline at end of file diff --git "a/markdown/metachat/guide/ iOS/\346\215\242\350\243\205\345\222\214\346\215\217\350\204\270 iOS.md" "b/markdown/metachat/guide/ iOS/\346\215\242\350\243\205\345\222\214\346\215\217\350\204\270 iOS.md" deleted file mode 100644 index dcc1c0e99a0..00000000000 --- "a/markdown/metachat/guide/ iOS/\346\215\242\350\243\205\345\222\214\346\215\217\350\204\270 iOS.md" +++ /dev/null @@ -1,90 +0,0 @@ -在虚拟场景中,塑造一个独一无二的虚拟形象是进入场景的第一步。元语聊支持导入自定义人物素材模型,并支持换装和捏脸功能。本文介绍如何在元语聊中实现对虚拟形象的换装和捏脸。 - -## 示例项目 - -声网在 GitHub 上提供开源 [Agora-MetaChat](https://github.com/AgoraIO-Community/Agora-MetaChat/tree/dev_sdk2) 示例项目供你参考使用。如果你还需了解 Unity 部分的工程文件和功能指南,请联系 sales@agora.io 获取。 - - -## 前提条件 - -实现换装和捏脸前,请确保你已实现基础的元语聊功能,如创建、进入 3D 场景、创建虚拟形象。详见[客户端实现](https://docs.agora.io/cn/metachat/metachat_client_ios?platform=All%20Platforms)。 - - -## 实现步骤 - -本节展示如何实现换装,内容以 Native 部分的开发为主,Unity 部分的开发请参考 Unity 工程文件和功能指南。捏脸的功能实现也请参考 Unity 工程文件。 - -下图展示 API 调用时序: - -![](https://web-cdn.agora.io/docs-files/1680172665142) - -### 1. 更换装扮 - -建议在业务逻辑中包含多个场景的情况下,调用 [`enterScene`](https://docs.agora.io/cn/metachat/metachat_api_ios?platform=All%20Platforms#enterscene) 时使用 `AgoraMetachatEnterSceneConfig` 中的 `extraCustomInfo` 来设置 `sceneIndex`,以便区分不同的场景。Unity 场景脚本可以根据 `sceneIndex` 来确定进入哪个场景,并执行相应的逻辑。 - -在这种情况下,我们将 `sceneIndex` 设置为“换装”或场景,这些场景只包含待更换装扮的用户,没有其他用户。因此,在这些场景中,只需要更换装扮。你可以通过 `AgoraMetachatScene` 的 [`sendMessageToScene`](https://docs.agora.io/cn/metachat/metachat_api_ios?platform=All%20Platforms#sendmessagetoscene) 方法向 Unity 场景发送自定义的换装消息。Unity 场景脚本可以处理对应的自定义消息,实现人物装扮的更换。 - -```swift -// 本节代码展示换装的逻辑 -// 创建 dressDic 字典,包含用户的着装信息,并将其转换成 JSON 格式的数据 -// 信息格式需要与 Unity 场景使用的格式协商一致 -let dressDic = ["gender": userDressInfo.gender, - "hair": userDressInfo.hair, - "tops": userDressInfo.tops, - "lower": userDressInfo.lower, - "shoes": userDressInfo.shoes] -let value = try? JSONSerialization.data(withJSONObject: dressDic, options: []) -let str = String(data: value!, encoding: String.Encoding.utf8) - -// 创建 msgDic 字段,包含 key 和 value -// 设置 key 为 dressSetting -// 设置 value 为 dressDic 的 JSON 字符串 -let msgDic = [ - "key": "dressSetting", - "value": str as Any -] as [String : Any] -data = try? JSONSerialization.data(withJSONObject:msgDic, options: .fragmentsAllowed) -// 将 msgDic 的 JSON 格式的数据(换装消息)发送到场景中 -metachatScene?.sendMessage(toScene: data) -``` - - -### 2. 同步装扮 - -更换人物装扮后,如果用户进入其他场景并需要让其他用户看到新形象,则需要同步更换的装扮信息。你可以通过 `AgoraMetachatLocalUserAvatar` 的 [`setDressInfo`](https://docs.agora.io/cn/metachat/metachat_api_ios?platform=All%20Platforms#setdressinfo) 方法让 SDK 将更新后的形象同步给场景中的其他用户: - - -```swift -// 本节代码展示同步装扮的逻辑 -// 创建 dict 字段,存储用户的着装信息,并将其转换成 JSON 格式的数据 -let dict = ["gender": userDressInfo.gender, - "hair": userDressInfo.hair, - "tops": userDressInfo.tops, - "lower": userDressInfo.lower, - "shoes": userDressInfo.shoes] -let value = try? JSONSerialization.data(withJSONObject: dict, options: []) -let str = String(data: value!, encoding: String.Encoding.utf8) - -let dressInfo = AgoraMetachatDressInfo() -// extraCustomInfo 是额外的自定义信息 -// 将 extraCustomInfo 设置为换装消息的 JSON 字符串 -dressInfo.extraCustomInfo = str!.data(using: String.Encoding.utf8) - -// 设置本地用户的模型信息 -let avatarInfo = AgoraMetachatAvatarModelInfo.init() -for info in sceneInfo.bundles { - if info.bundleType == .avatar { - avatarInfo.bundleCode = info.bundleCode; - break - } -} - -localUserAvatar = metachatScene?.getLocalUserAvatar() -// 设置用户信息 -localUserAvatar?.setUserInfo(currentUserInfo) -// 设置本地用户的模型信息 -localUserAvatar?.setModelInfo(avatarInfo) -// 设置本地用户的服装信息 -localUserAvatar?.setDressInfo(currentDressInfo) -``` - diff --git "a/markdown/metachat/guide/ iOS/\347\251\272\351\227\264\351\237\263\346\225\210 iOS.md" "b/markdown/metachat/guide/ iOS/\347\251\272\351\227\264\351\237\263\346\225\210 iOS.md" deleted file mode 100644 index 84cb7042856..00000000000 --- "a/markdown/metachat/guide/ iOS/\347\251\272\351\227\264\351\237\263\346\225\210 iOS.md" +++ /dev/null @@ -1,171 +0,0 @@ -本文介绍如何使用空间音效功能以增强元宇宙音频体验。 - -在元宇宙中,空间音效可以为用户带来更加真实、身临其境的虚拟体验。例如,在一个虚拟的 3D 旅游场景中,空间音效可以让用户宛如身临其境般听到旅游中路人聊天声、海浪声、风声,让用户更沉浸式体验。 - -![](https://web-cdn.agora.io/docs-files/1679566933312) - -## 技术原理 - -空间音效功能基于声学原理,模拟声音在不同空间环境中的传播、反射、吸收效果。通过在不同位置放置音源和听众,模拟现实中的声音传播效果,使得听众可以听到更真实自然的声音。 - -结合 `AgoraMetachatSceneEventDelegate` 提供的用户位置信息回调和 `AgoraLocalSpatialAudioKit` 提供的空间音效系列方法,你可以实现带空间音效的元语聊。 - -## 示例项目 - -声网在 GitHub 上提供开源 [Agora-MetaChat](https://github.com/AgoraIO-Community/Agora-MetaChat/tree/dev_sdk2) 示例项目供你参考使用。如果你还需了解 Unity 部分的工程文件和功能指南,请联系 sales@agora.io 获取。 - - -## 前提条件 - -实现空间音效前,请确保你已实现基础的元语聊功能,如创建、进入 3D 场景、创建虚拟形象。详见[客户端实现](https://docs.agora.io/cn/metachat/metachat_client_ios?platform=All%20Platforms)。 - - -## 实现步骤 - -用户在元宇宙中听到的声音分为两类: - -- 远端用户的音频 -- 本地媒体播放器播放的音频 - -因此,实现空间音效时,你需要按照如下步骤对两种音频都进行处理。 - -### 用户空间音效 - -下图介绍实现用户空间音效的 API 时序: - -![](https://web-cdn.agora.io/docs-files/1679996795148) - - -#### 1. 创建和初始化空间音效引擎 - -使用空间音效前,你需要调用 [`sharedLocalSpatialAudioWithConfig`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_audio_effect.html#api_ilocalspatialaudioengine_initialize) 创建和初始化空间音效引擎。 - -**注意**:请在加入 RTC 频道前调用。 - -```swift -// 创建和初始化空间音效引擎 -let localSpatialConfig = AgoraLocalSpatialAudioConfig() -localSpatialConfig.rtcEngine = rtcEngine -agoraLocalSpatialAudioKit = AgoraLocalSpatialAudioKit.sharedLocalSpatialAudio(with: localSpatialConfig) -``` - - -#### 2.设置空间音效接收范围 - -调用 [`setAudioRecvRange`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_audio_effect.html#api_ibasespatialaudioengine_setaudiorecvrange) 设置空间音效接收范围,当远端用户相对本地用户的距离超出这个范围,本地用户就会听不到远端用户的声音。 - -当使用空间音效时,请确保在 `AgoraRtcEngineKit` 中将音频流的发布和订阅都设置为 `mute`,即停止发布和订阅音频流。在后续的逻辑中,应由 `AgoraLocalSpatialAudioKit` 处理是否停止发布和订阅音频流。 - -```swift -// 设置空间音效的音频接收范围 -// 如果超过设置的值,那么本地用户听不见远端用户的声音 -agoraLocalSpatialAudioKit.setAudioRecvRange(100) -// AgoraLocalSpatialAudioKit 设置恢复发布本地音频流 -// 此时需要额外检查本地用户角色不是观众,否则无法发流 -agoraLocalSpatialAudioKit.muteLocalAudioStream(false) -// AgoraLocalSpatialAudioKit 设置恢复订阅所有远端音频流 -agoraLocalSpatialAudioKit.muteAllRemoteAudioStreams(false) -``` - - -#### 3. 处理用户位置变化 - -通过 [`onUserPositionChanged`](https://docs.agora.io/cn/metachat/metachat_api_ios?platform=All%20Platforms#onuserpositionchanged) 回调监听用户的位置变化。如果当前用户是本地用户,调用 [`updateSelfPosition`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_audio_effect.html#api_ibasespatialaudioengine_updateselfposition) 更新本地用户位置信息;如果当前用户是远端用户,调用 [`updateRemotePosition`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_audio_effect.html#api_ilocalspatialaudioengine_updateremoteposition) 更新远端用户的信息位置。 - -**注意**:请在加入 RTC 频道后监听和处理用户位置变化。 - -```swift -// 处理用户位置的变化 -func metachatScene(_ scene: AgoraMetachatScene, onUserPositionChanged uid: String, posInfo: AgoraMetachatPositionInfo) { - if (uid.compare(KeyCenter.RTM_UID) == .orderedSame) || (uid.compare("") == .orderedSame) { - // 如果当前用户是本地用户 - // 那么使用 updateSelfPosition 更新本地用户的位置信息 - // 否则使用 updateRemotePosition 更新远端用户的位置信息 - agoraLocalSpatialAudioKit.updateSelfPosition( - posInfo.position as! [NSNumber], - axisForward: posInfo.forward as! [NSNumber], - axisRight: posInfo.right as! [NSNumber], - axisUp: posInfo.up as! [NSNumber] - ) - DLog("position = \(posInfo.position), forword = \(posInfo.forward), right = \(posInfo.right), up = \(posInfo.up)") - } else { - let remotePositionInfo = AgoraRemoteVoicePositionInfo() - remotePositionInfo.position = posInfo.position as! [NSNumber] - remotePositionInfo.forward = posInfo.forward as? [NSNumber] - - agoraLocalSpatialAudioKit.updateRemotePosition( - UInt(uid) ?? 0, - positionInfo: remotePositionInfo - ) - } -} -``` - - -#### 4. 销毁空间音效引擎 - -不需要使用空间音效时,调用 [`destroy`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_audio_effect.html#api_ilocalspatialaudioengine_release) 销毁空间音效引擎。 - -**注意**:请在离开 RTC 频道后和销毁 RTC 引擎前调用 destroy。 - -```swift -// 销毁空间音效引擎 -if agoraLocalSpatialAudioKit != nil { - AgoraLocalSpatialAudioKit.destroy() - agoraLocalSpatialAudioKit = nil -} -``` - - -### 音乐空间音效 - -下图介绍实现媒体播放器空间音效的 API 时序: - -![](https://web-cdn.agora.io/docs-files/1679996803493) - -由于空间音效是基于人物的位置驱动,因此在进入 Unity 场景后,无论人物是否移动,都需要 Unity 脚本主动向 app 发送一次元宇宙中 NPC 或物体的位置信息。这样可以确保空间音效引擎始终基于最新的位置数据提供空间音效。 - -#### 1. 实现媒体播放器 - -参考[媒体播放器](https://docs.agora.io/cn/live-streaming-premium-4.x/media_player_apple_ng?platform=iOS)功能指南创建一个 `AgoraMediaPlayerProtocol` 对象,然后打开、播放媒体资源。 - -```swift -// 创建 AgoraRtcEngineKit 对象 -rtcEngine = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self) -// 创建 AgoraMediaPlayerProtocol 对象 -mediaPlayerKit = rtcEngine.createMediaPlayer(with: self) -// 打开 URL -mediaPlayerKit.open(url, startPos: 0) -// 请确保在收到 AgoraMediaPlayerStateOpenCompleted 后再调用 play -mediaPlayerKit.play() -``` - -#### 2. 设置播放器空间音效 - -处理 Unity 场景的回调信息,解析得到物体的三维坐标位置和朝向,并将这些信息传入 [`updatePlayerPositionInfo`](https://docs.agora.io/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_audio_effect.html#api_ibasespatialaudioengine_updateplayerpositioninfo) 方法,设置播放器的空间音效。 - - -```swift -// 处理 Unity 场景回调信息 -func metachatScene(_ scene: AgoraMetachatScene, onRecvMessageFromScene message: Data) { - // 解析 message,得到物体在场景里面的位置信息,包含 position 和 forward - // position 是物体的三维坐标位置 - // forward 是物体朝向 - // 注意:message 协议格式需要由你们的 Unity 开发人员和 Native 开发人员协商规定 - ... - - // 设置位置和朝向信息 - let positionInfo = AgoraRemoteVoicePositionInfo() - positionInfo.position = position // position 为解析得到的物体位置 - positionInfo.forward = forward // forward 为解析得到的物体朝向 - if let playerId = player?.getMediaPlayerId() { - // 设置播放器的空间音效 - agoraLocalSpatialAudioKit?.updatePlayerPositionInfo( - Int(playerId), - positionInfo: positionInfo - ) - } -} -``` - - diff --git "a/markdown/metachat/image/ Android/\345\205\261\350\265\217 Android.wsd" "b/markdown/metachat/image/ Android/\345\205\261\350\265\217 Android.wsd" deleted file mode 100644 index 74bdcc224b9..00000000000 --- "a/markdown/metachat/image/ Android/\345\205\261\350\265\217 Android.wsd" +++ /dev/null @@ -1,46 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "RtcEngine" as e #White -participant "IMediaPlayer" as d #White -participant "IMetachatScene" as f -participant "IMediaPlayerObserver" as b #White -participant "IMediaPlayerVideoFrameObserver" as c #White -a -> f: 完成一系列准备工作并进入场景 -== 开启视频显示屏 == -a -> f: enableVideoDisplay -== 完成播放的准备工作 == -a -> d: createMediaPlayer -a -> d: open -a -> e: joinChannel -note right -publishMicrophoneTrack(true) -publishMediaPlayerAudioTrack(true) -publishMediaPlayerId 中传入 MediaPlayer 的 ID -end note -== 创建数据流 == -a -> e: createDataStream -note right -数据流用于在多端同步播放进度等信息 -end note -== 开始播放 == -a -> d: play -== 同步播放进度 == -b --> a: onPositionChanged -a -> e: sendStreamMessage -note right -将媒体文件 URL 和播放进度同步给远端 -end note -== 获取并推送视频至显示屏 == -c --> a: onFrame -a -> f: pushVideoFrameToDisplay -== 停止播放 == -a -> d: stop -a -> e: sendStreamMessage -note right -停止播发时将发送的媒体文件 URL 设为空 -end note -== 离开 RTC 频道和 MetachatScene == -a -> e: leaveChannel -a -> f: leaveScene -@enduml \ No newline at end of file diff --git "a/markdown/metachat/image/ Android/\346\215\242\350\243\205\346\215\217\350\204\270 Android.wsd" "b/markdown/metachat/image/ Android/\346\215\242\350\243\205\346\215\217\350\204\270 Android.wsd" deleted file mode 100644 index c944bc260ae..00000000000 --- "a/markdown/metachat/image/ Android/\346\215\242\350\243\205\346\215\217\350\204\270 Android.wsd" +++ /dev/null @@ -1,23 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "IMetachatScene" as b #White -participant "ILocalUserAvatar" as e #White -participant "Unity 场景" as c -== 进入换装或捏脸场景 == -a -> b: 进入换装或捏脸场景 -== 发送自定义消息给 Unity 场景 == -a -> b: sendMessageToScene -b -> c: 发送装扮或脸部特征消息 -== 设置换装或捏脸 == -c -> c: 接收消息并更换装扮或脸部特性 -== 离开换装或捏脸场景 == -a -> b: 离开场景 -== 进入其他场景 == -a -> b: 进入其他场景 -== 向其他用户同步装扮或脸部特征 == -a -> b: getLocalUserAvatar -a -> e: setDressInfo/setFaceInfo -a -> e: applyInfo -e -> c: 展示用户 Avatar -c -> c: 展示更新后的装扮/脸部特征 \ No newline at end of file diff --git "a/markdown/metachat/image/ Android/\347\251\272\351\227\264\351\237\263\346\225\210 Android.wsd" "b/markdown/metachat/image/ Android/\347\251\272\351\227\264\351\237\263\346\225\210 Android.wsd" deleted file mode 100644 index 9d7daf4e3ca..00000000000 --- "a/markdown/metachat/image/ Android/\347\251\272\351\227\264\351\237\263\346\225\210 Android.wsd" +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "RtcEngine" as c #White -participant "ILocalSpatialAudioEngine" as d #White -participant "IMetachatScene" as e -participant "IMetachatSceneEventHandler" as b -== 初始化引擎 == -a -> c: 创建和初始化 RTC 引擎 -a -> d: 创建和初始化空间音效引擎 -== 创建 MetachatScene 并注册事件监听 == -a -> b: 创建 MetachatScene 事件监听器 -a -> e: 创建 MetachatScene 并注册 MetachatScene 事件监听器 -== 进入 MetachatScene == -a -> e: 进入场景 -b --> a: onEnterSceneResult -critical #mistyrose -== 设置空间音效接收范围 == -a -> c: 加入 RTC 频道 -a -> c: 停止发布和订阅音频流 -a -> d: setAudioRecvRange -a -> d: 恢复发布和订阅音频流 -== 处理用户位置变化 == -a -> e: enableUserPositionNotification -b --> a: onUserPositionChanged -a -> d: updateSelfPosition/updateRemotePosition -note right -本地用户调用 updateSelfPostion -远端用户调用 updateRemotePosition -end note -end -== 离开 MetachatScene == -a -> e: 离开场景 -b --> a: onLeaveSceneResult -== 销毁空间音频引擎 == -a -> c: 离开 RTC 频道 -a -> d: 销毁空间音效引擎 -a -> c: 销毁 RTC 引擎 -@enduml \ No newline at end of file diff --git "a/markdown/metachat/image/ Android/\351\237\263\344\271\220\347\251\272\351\227\264\351\237\263\346\225\210 Android.wsd" "b/markdown/metachat/image/ Android/\351\237\263\344\271\220\347\251\272\351\227\264\351\237\263\346\225\210 Android.wsd" deleted file mode 100644 index 5fb0914de5b..00000000000 --- "a/markdown/metachat/image/ Android/\351\237\263\344\271\220\347\251\272\351\227\264\351\237\263\346\225\210 Android.wsd" +++ /dev/null @@ -1,45 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "RtcEngine" as c #White -participant "ILocalSpatialAudioEngine" as d #White -participant "IMetachatScene" as e -participant "IMetachatSceneEventHandler" as b -participant "IMediaPlayer" as f -== 初始化引擎 == -a -> c: 创建和初始化 RTC 引擎 -a -> d: 创建和初始化空间音效引擎 -== 创建 MetachatScene 并注册事件监听 == -a -> b: 创建 MetachatScene 事件监听器 -a -> e: 创建 MetachatScene 并注册 MetachatScene 事件监听器 -== 进入 MetachatScene == -a -> e: 进入场景 -b --> a: onEnterSceneResult -critical #mistyrose -== 设置空间音效接收范围 == -a -> c: 加入 RTC 频道 -a -> c: 停止发布和订阅音频流 -a -> d: setAudioRecvRange -a -> d: 恢复发布和订阅音频流 -== 播放音乐 == -a -> f: createMediaPlayer -a -> f: open -a -> f: play -== 设置播放器空间音效 == -b -> a: onRecvMessageFromScene -note right -Unity 场景主动发送的人和物位置信息 -end note -a -> a: 解析位置信息 -a -> d: updatePlayerPositionInfo -== 停止播放音乐 == -a -> f: stop -end -== 离开 MetachatScene == -a -> e: 离开场景 -b --> a: onLeaveSceneResult -== 销毁空间音频引擎 == -a -> c: 离开 RTC 频道 -a -> d: 销毁空间音效引擎 -a -> c: 销毁 RTC 引擎 -@enduml \ No newline at end of file diff --git "a/markdown/metachat/image/ iOS/\345\205\261\350\265\217 iOS.wsd" "b/markdown/metachat/image/ iOS/\345\205\261\350\265\217 iOS.wsd" deleted file mode 100644 index 5004e562188..00000000000 --- "a/markdown/metachat/image/ iOS/\345\205\261\350\265\217 iOS.wsd" +++ /dev/null @@ -1,46 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "AgoraRtcEngineKit" as e #White -participant "AgoraRtcMediaPlayerProtocol" as d #White -participant "AgoraMetachatScene" as f -participant "AgoraRtcMediaPlayerDelegate" as b #White -participant "AgoraRtcMediaPlayerVideoFrameDelegate" as c #White -a -> f: 完成一系列准备工作并进入场景 -== 开启视频显示屏 == -a -> f: enableVideoDisplay -== 完成播放的准备工作 == -a -> d: createMediaPlayerWithDelegate -a -> d: open -a -> e: joinChannelByToken -note right -publishMicrophoneTrack(YES) -publishMediaPlayerAudioTrack(YES) -publishMediaPlayerId 中传入 MediaPlayer 的 ID -end note -== 创建数据流 == -a -> e: createDataStream -note right -数据流用于在多端同步播放进度等信息 -end note -== 开始播放 == -a -> d: play -== 同步播放进度 == -b --> a: didChangedToState -a -> e: sendStreamMessage -note right -将媒体文件 URL 和播放进度同步给远端 -end note -== 获取并推送视频至显示屏 == -c --> a: didReceiveVideoFrame -a -> f: pushVideoFrameToDisplay -== 停止播放 == -a -> d: stop -a -> e: sendStreamMessage -note right -停止播发时将发送的媒体文件 URL 设为空 -end note -== 离开 RTC 频道和 MetachatScene == -a -> e: leaveChannel -a -> f: leaveScene -@enduml \ No newline at end of file diff --git "a/markdown/metachat/image/ iOS/\346\215\242\350\243\205\346\215\217\350\204\270 iOS.wsd" "b/markdown/metachat/image/ iOS/\346\215\242\350\243\205\346\215\217\350\204\270 iOS.wsd" deleted file mode 100644 index 02cc002e17d..00000000000 --- "a/markdown/metachat/image/ iOS/\346\215\242\350\243\205\346\215\217\350\204\270 iOS.wsd" +++ /dev/null @@ -1,23 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "AgoraMetachatScene" as b #White -participant "AgoraMetachatLocalUserAvatar" as e #White -participant "Unity 场景" as c -== 进入换装或捏脸场景 == -a -> b: 进入换装或捏脸场景 -== 发送自定义消息给 Unity 场景 == -a -> b: sendMessageToScene -b -> c: 发送装扮或脸部特征消息 -== 设置换装或捏脸 == -c -> c: 接收消息并更换装扮或脸部特性 -== 离开换装或捏脸场景 == -a -> b: 离开场景 -== 进入其他场景 == -a -> b: 进入其他场景 -== 向其他用户同步装扮或脸部特征 == -a -> b: getLocalUserAvatar -a -> e: setDressInfo/setFaceInfo -a -> e: applyInfo -e -> c: 展示用户 Avatar -c -> c: 展示更新后的装扮/脸部特征 \ No newline at end of file diff --git "a/markdown/metachat/image/ iOS/\347\251\272\351\227\264\351\237\263\346\225\210 iOS.wsd" "b/markdown/metachat/image/ iOS/\347\251\272\351\227\264\351\237\263\346\225\210 iOS.wsd" deleted file mode 100644 index 8583c5378dd..00000000000 --- "a/markdown/metachat/image/ iOS/\347\251\272\351\227\264\351\237\263\346\225\210 iOS.wsd" +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "AgoraRtcEngineKit" as c #White -participant "AgoraLocalSpatialAudioKit" as d #White -participant "AgoraMetachatScene" as e -participant "AgoraMetachatSceneEventDelegate" as b -== 初始化引擎 == -a -> c: 创建和初始化 RTC 引擎 -a -> d: 创建和初始化空间音效引擎 -== 创建 MetachatScene 并注册事件监听 == -a -> b: 创建 MetachatScene 事件监听器 -a -> e: 创建 MetachatScene 并注册 MetachatScene 事件监听器 -== 进入 MetachatScene == -a -> e: 进入场景 -b --> a: onEnterSceneResult -critical #mistyrose -== 设置空间音效接收范围 == -a -> c: 加入 RTC 频道 -a -> c: 停止发布和订阅音频流 -a -> d: setAudioRecvRange -a -> d: 恢复发布和订阅音频流 -== 处理用户位置变化 == -a -> e: enableUserPositionNotification -b --> a: onUserPositionChanged -a -> d: updateSelfPosition/updateRemotePosition -note right -本地用户调用 updateSelfPostion -远端用户调用 updateRemotePosition -end note -end -== 离开 MetachatScene == -a -> e: 离开场景 -b --> a: onLeaveSceneResult -== 销毁空间音频引擎 == -a -> c: 离开 RTC 频道 -a -> d: 销毁空间音效引擎 -a -> c: 销毁 RTC 引擎 -@enduml \ No newline at end of file diff --git "a/markdown/metachat/image/ iOS/\351\237\263\344\271\220\347\251\272\351\227\264\351\237\263\346\225\210 iOS.wsd" "b/markdown/metachat/image/ iOS/\351\237\263\344\271\220\347\251\272\351\227\264\351\237\263\346\225\210 iOS.wsd" deleted file mode 100644 index 0bb76e4ecdc..00000000000 --- "a/markdown/metachat/image/ iOS/\351\237\263\344\271\220\347\251\272\351\227\264\351\237\263\346\225\210 iOS.wsd" +++ /dev/null @@ -1,45 +0,0 @@ -@startuml -autonumber -participant "App" as a #LightGrey -participant "AgoraRtcEngineKit" as c #White -participant "AgoraLocalSpatialAudioKit" as d #White -participant "AgoraMetachatScene" as e -participant "AgoraMetachatSceneEventDelegate" as b -participant "AgoraMediaPlayerProtocol" as f -== 初始化引擎 == -a -> c: 创建和初始化 RTC 引擎 -a -> d: 创建和初始化空间音效引擎 -== 创建 MetachatScene 并注册事件监听 == -a -> b: 创建 MetachatScene 事件监听器 -a -> e: 创建 MetachatScene 并注册 MetachatScene 事件监听器 -== 进入 MetachatScene == -a -> e: 进入场景 -b --> a: onEnterSceneResult -critical #mistyrose -== 设置空间音效接收范围 == -a -> c: 加入 RTC 频道 -a -> c: 停止发布和订阅音频流 -a -> d: setAudioRecvRange -a -> d: 恢复发布和订阅音频流 -== 播放音乐 == -a -> f: createMediaPlayerWithDelegate -a -> f: open -a -> f: play -== 设置播放器空间音效 == -b -> a: onRecvMessageFromScene -note right -Unity 场景主动发送的人和物位置信息 -end note -a -> a: 解析位置信息 -a -> d: updatePlayerPositionInfo -== 停止播放音乐 == -a -> f: stop -end -== 离开 MetachatScene == -a -> e: 离开场景 -b --> a: onLeaveSceneResult -== 销毁空间音频引擎 == -a -> c: 离开 RTC 频道 -a -> d: 销毁空间音效引擎 -a -> c: 销毁 RTC 引擎 -@enduml \ No newline at end of file