大逃杀游戏 | 提供大逃杀类型游戏、生存射击类手游中特有的“仅小队”或“所有人”的语音模式。在游戏设置中,根据玩家选择:
1、如果使用“仅小队”模式,则只能听见同队伍中队友说话的声音。
2、如果使用“所有人”模式,则可以听见队伍中队友声音,以及一定范围内其他对局玩家说话的声音。 |
沉浸式虚拟场景 | 例如游戏演唱会等虚拟场景中,可以通过范围语音实现演唱者在虚拟房间内唱歌,台下所有听众可以听到歌声的同时,能与自身一定范围内其他听众进行交流,最高可支持同房间内上万人同时开启麦克风。 |
语音模式 | 参数名称 | 功能 |
所有人 | RANGE_AUDIO_MODE_WORLD | 设置后玩家附近一定范围的人都能听到该玩家讲话,如果范围内也有玩家设置为此模式,则也可以互相通话。 队友可以互相听到 |
仅小队 | RANGE_AUDIO_MODE_TEAM | 仅队友可以互相听到 |
玩家坐标 | 语音接收范围 | 与另一玩家声音可达情况 | 与队友声音可达情况 |
A(0,0,0) | 10米 | 可以听到玩家 B 的声音,因为 B 玩家距离 A 玩家在10米内 | 不影响同一小队成员互相通话 |
B(0,8,0) | 5米 | 不可以听到玩家 A 的声音,因为 A 玩家与 B 玩家距离超过5米 | 不影响同一小队成员互相通话 |
TeamID 情况 | 语音模式 | 范围 | 声音可达情况 |
TeamID != 0,假设 TeamID = 1 | RANGE_AUDIO_MODE_TEAM | 10米 | 声音只能和 TeamID = 1 的成员互通 |
| RANGE_AUDIO_MODE_WORLD | 10米 | 声音能和 TeamID = 1 的成员、以及语音模式设置为 RANGE_AUDIO_MODE_WORLD 的同房间10米范围内成员互通 |
TeamID 情况 | TeamID 修改时机 | 范围 | 声音可达情况 |
TeamID = 0 | 进房前 TeamID != 0,进房后修改 TeamID = 0 | 10米 | 说话声音全房间成员(不论语音模式是所有人还是仅小队)都能听到 能与 TeamID = 0 的成员互相沟通 能听到设置为 RANGE_AUDIO_MODE_WORLD 的同房间10米范围内成员声音 |
| 进房前 TeamID = 0,以 TeamID = 0 进入房间 | 10米 | 说话声音全房间成员(不论语音模式是所有人还是仅小队)都能听到 能与 TeamID = 0 的成员互相沟通 不能听到房间内其他人说话声音 |
ITMGContext SetRangeAudioTeamID(int teamID)
参数 | 类型 | 意义 |
teamID | int | 队伍号,专供范围语音模式中使用。当 TeamID 为0时,通话模式为普通小队语音,默认0。 |
ITMGRoom int SetRangeAudioMode(RANGE_AUDIO_MODE rangeAudioMode)
参数 | 类型 | 意义 |
rangeAudioMode | int | 0(MODE_WORLD) 代表“所有人”,1(MODE_TEAM) 代表"仅小队" |
ITMGContext.GetInstance(this).EnterRoom(roomId,ITMG_ROOM_TYPE_FLUENCY, authBuffer);
public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_ENTER_ROOM == type){//对事件返回的 Data 进行解析int nErrCode = data.getIntExtra("result" , -1);String strErrMsg = data.getStringExtra("error_info");if (nErrCode == AVError.AV_OK){//收到进房信令,进房成功,可以操作设备ScrollView_ShowLog("EnterRoom success");Log.i(TAG,"EnterRoom success!");}else{//进房失败,需分析返回的错误信息ScrollView_ShowLog("EnterRoom fail :" + strErrMsg);Log.i(TAG,"EnterRoom fail!");}}}
ITMGRoom int UpdateAudioRecvRange(int range)
参数 | 类型 | 意义 |
range | int | 最大可以接收音频的范围,单位为引擎距离单位 |
ITMGContext.GetInstance().GetRoom().UpdateAudioRecvRange(300);
public abstract int UpdateSelfPosition(int position[3], float axisForward[3], float axisRight[3], float axisUp[3])
参数 | 类型 | 意义 |
position | int[] | 自身在世界坐标系中的坐标,顺序是前、右、上 |
axisForward | float[] | 在本产品中无需关注 |
axisRight | float[] | 在本产品中无需关注 |
axisUp | float[] | 在本产品中无需关注 |
public abstract int InitSpatializer(string modelPath)
参数 | 类型 | 意义 |
modelPath | string | 填空即可 |
public abstract int EnableSpatializer(bool enable, bool applyToTeam)
参数 | 类型 | 意义 |
enable | bool | 开启之后可以听到 3D 音效 |
applyToTeam | bool | 3D 语音是否作用于小队内部,仅 enble 为 true 时有效 |
ITMGRoom int UpdateAudioRecvRange(int range)
参数 | 类型 | 意义 |
range | int | 最大可以接收音频的范围,单位为引擎距离单位 |
ITMGContext.GetInstance().GetRoom().UpdateAudioRecvRange(300);
public abstract int UpdateSelfPosition(int position[3], float axisForward[3], float axisRight[3], float axisUp[3])
参数 | 类型 | 意义 |
position | int[] | 自身在世界坐标系中的坐标,顺序是前、右、上 |
axisForward | float[] | 自身坐标系前轴的单位向量 |
axisRight | float[] | 自身坐标系右轴的单位向量 |
axisUp | float[] | 自身坐标系上轴的单位向量 |
FVector cameraLocation = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0)->GetCameraLocation();FRotator cameraRotation = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0)->GetCameraRotation();int position[] = {(int)cameraLocation.X,(int)cameraLocation.Y,(int)cameraLocation.Z };FMatrix matrix = ((FRotationMatrix)cameraRotation);float forward[] = {matrix.GetColumn(0).X,matrix.GetColumn(1).X,matrix.GetColumn(2).X };float right[] = {matrix.GetColumn(0).Y,matrix.GetColumn(1).Y,matrix.GetColumn(2).Y };float up[] = {matrix.GetColumn(0).Z,matrix.GetColumn(1).Z,matrix.GetColumn(2).Z};ITMGContextGetInstance()->GetRoom()->UpdateSelfPosition(position, forward, right, up);
Transform selftrans = currentPlayer.gameObject.transform;Matrix4x4 matrix = Matrix4x4.TRS(Vector3.zero, selftrans.rotation, Vector3.one);int[] position = new int[3] {selftrans.position.z,selftrans.position.x,selftrans.position.y};float[] axisForward = new float[3] {matrix.m22,matrix.m02,matrix.m12 };float[] axisRight = new float[3] {matrix.m20,matrix.m00,matrix.m10 };float[] axisUp = new float[3] {matrix.m21,matrix.m01,matrix.m11 };ITMGContext.GetInstance().GetRoom().UpdateSelfPosition(position, axisForward, axisRight, axisUp);
主持人 API 时序 | 听众 API 时序 |
| |
是否同一小队 | 是否范围内 | 语音模式 | A与B 是否能相互听到对方的声音 |
同一小队 | 是 | MODE_WORLD | 是 |
| | MODE_TEAM | 是 |
| 否 | MODE_WORLD | 是 |
| | MODE_TEAM | 是 |
不同小队 | 是 | MODE_WORLD | 是 |
| | MODE_TEAM | 否 |
| 否 | MODE_WORLD | 否 |
| | MODE_TEAM | 否 |
是否同一小队 | 是否范围内 | 语音状态 | A与B 是否能相互听到对方的声音 |
同一小队 | 是 | MODE_WORLD | 是 |
| | MODE_TEAM | 是 |
| 否 | MODE_WORLD | 是 |
| | MODE_TEAM | 是 |
不同小队 | 是 | MODE_WORLD | 否 |
| | MODE_TEAM | 否 |
| 否 | MODE_WORLD | 否 |
| | MODE_TEAM | 否 |
距离范围(引擎单位) | 衰减公式 |
0 < N < range/10 | 衰减系数:1.0 (音量无衰减) |
N ≥ range/10 | 衰减系数:range/10/N |
本页内容是否解决了您的问题?