배틀 로얄 게임 | 배틀 로얄 게임 및 서바이벌 슈팅 모바일 게임에서 ‘팀원만’ 또는 ‘모든 사람’ 음성 모드를 제공합니다. 게임 설정에서 플레이어 선택에 따라:
1. ‘팀원만’ 모드를 사용하면 같은 팀의 팀원이 말하는 음성만 들립니다.
2. ‘모든 사람’ 모드를 사용하면 팀원의 목소리와 일정 범위 내의 다른 플레이어의 음성을 들을 수 있습니다. |
몰입형 버츄얼 시나리오 | 예를 들어 게임 콘서트와 같은 가상의 시나리오에서 가수는 가상의 방에서 레인지 보이스를 통해 노래를 부를 수 있고, 객석에 있는 모든 시청자들은 노래를 듣고 일정 범위 내의 다른 관객과 소통할 수 있습니다. 같은 방에 있는 수만 명의 사람들이 동시에 마이크를 활성화할 수 있습니다. |
음성 모드 | 매개변수 | 기능 |
모든 사람 | RANGE_AUDIO_MODE_WORLD | 이 모드에서 로컬 플레이어는 특정 범위 내에 있는 다른 플레이어의 소리를 들을 수 있고, 그들도 이 모드에 있는 경우 서로 대화할 수 있습니다. 팀원들은 서로의 말을 들을 수 있습니다 |
팀원만 | RANGE_AUDIO_MODE_TEAM | 팀원만 서로의 말을 들을 수 있습니다 |
플레이어 좌표 | 음성 수신 범위 | 다른 플레이어의 음성 도달 가능성 | 팀원의 음성 도달 가능성 |
A(0,0,0) | 10미터 | 플레이어 B는 플레이어로부터 10미터 이내에 있으므로 플레이어 B의 소리를 들을 수 있습니다 | 팀원끼리 대화가 가능합니다 |
B(0,8,0) | 5미터 | 플레이어 A가 5미터 이상 떨어져 있기 때문에 플레이어 B는 플레이어 A의 소리를 들을 수 없습니다 | 팀원끼리 대화가 가능합니다 |
TeamID | 음성 모드 | 범위 | 음성 도달 가능성 |
TeamID != 0, TeamID = 1이라고 가정합니다 | RANGE_AUDIO_MODE_TEAM | 10미터 | 사용자는 TeamID = 1인 구성원과만 대화할 수 있습니다 |
| RANGE_AUDIO_MODE_WORLD | 10미터 | 사용자는 TeamID = 1인 구성원 및 RANGE_AUDIO_MODE_WORLD 음성 모드의 구성원과 10m 이내의 같은 방에서 대화할 수 있습니다 |
TeamID 상황 | TeamID 수정 시간 | 범위 | 음성 도달 가능성 |
TeamID = 0 | 방 입장 전에는 TeamID != 0이며, 입장 후에는 TeamID = 0으로 변경됩니다 | 10미터 | 방에 있는 모든 구성원(음성 모드에 관계없이)이 음성을 들을 수 있습니다 사용자는 TeamID = 0 인 구성원과 대화할 수 있습니다 사용자는 같은 방에서 10미터 이내의 RANGE_AUDIO_MODE_WORLD 음성 모드로 구성원의 목소리를 들을 수 있습니다 |
| 방 입장 전 TeamID = 0, 방 입장 중 TeamID = 0 | 10미터 | 방에 있는 모든 구성원(음성 모드에 관계없이)이 음성을 들을 수 있습니다 사용자는 TeamID = 0 인 구성원과 대화할 수 있습니다 방에 있는 다른 구성원의 소리를 들을 수 없습니다 |
ITMGContext SetRangeAudioTeamID(int teamID)
매개변수 | 유형 | 설명 |
teamID | int | 레인지 보이스 모드에서만 사용되는 TeamID. 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 음향 효과 사용 여부를 지정합니다. enable이 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가 서로 들을 수 있는지 여부 |
Yes | Yes | MODE_WORLD | Yes |
| | MODE_TEAM | Yes |
| No | MODE_WORLD | Yes |
| | MODE_TEAM | Yes |
Yes | Yes | MODE_WORLD | Yes |
| | MODE_TEAM | No |
| No | MODE_WORLD | No |
| | MODE_TEAM | No |
같은 팀 여부 | 범위 내 여부 | 음성 모드 | A와 B가 서로 들을 수 있는지 여부 |
Yes | Yes | MODE_WORLD | Yes |
| | MODE_TEAM | Yes |
| No | MODE_WORLD | Yes |
| | MODE_TEAM | Yes |
Yes | Yes | MODE_WORLD | No |
| | MODE_TEAM | No |
| No | MODE_WORLD | No |
| | MODE_TEAM | No |
거리(엔진 단위) | 감쇠 공식 |
0 < N < range/10 | 감쇠 계수: 1.0(감쇠 없음) |
N ≥ range/10 | 감쇠 계수: range/10/N |
문제 해결에 도움이 되었나요?