tencent cloud

Game Multimedia Engine

릴리스 노트
제품 소개
제품 개요
장점 및 특징
제품 기능
응용 시나리오
보안 및 컴플라이언스 인증
사용자 튜토리얼
SDK 다운로드 가이드
제품 기능 데모
기본 기능 데모
시나리오 기반 Demo
콘솔 가이드
사용량 조회
서비스 활성화
시작하기
Quick Integration of SDK
Quick Integration of Sample Project
기본 기능 개발 가이드
인증 키
실시간 음성 채팅 역할 설정
음질 선택
고급 기능 개발 가이드
서버 녹음
레인지 보이스
3D 음향 효과
음향 효과 및 반주
네트워크 오디오 스트림 포워딩 라우팅
사용자 지정 메시지 채널
회사 방화벽 제한을 해결하는 방법
Language Parameter Reference List
GME 채팅방 관리 통합
클라이언트 API
Unity SDK
SDK for Unreal Engine
Cocos2D SDK
SDK for Windows
SDK for iOS
SDK for Android
SDK for macOS
H5 SDK
Electron SDK
SDK for Flutter
SDK Version Upgrade Guide
에러 코드
Toolchain
Server APIs
History
Introduction
API Category
Usage APIs
Recording APIs
Making API Requests
Voice Chat APIs
Application APIs
Data Types
Error Codes
FAQ
제품 기능
문제 해결 가이드
과금
Sample Project 사용 문제
일반 문제
인증
방 입장 실패
사운드 및 오디오
네트워크
음성을 텍스트로 변환
프로그램 내보내기
Service Agreement
Service Level Agreement
문의하기
용어집
GME 정책
데이터 처리 및 보안 계약
개인 정보 보호 정책

3D 음향 효과

PDF
포커스 모드
폰트 크기
마지막 업데이트 시간: 2024-01-18 16:00:04
본문은 3D 음향 효과를 위해 GME(Game Multimedia Engine) API를 통합하고 디버깅하는 방법을 설명합니다.

사용 사례

방 입장을 위한 일반적인 음성 채팅에서 플레이어 음성에는 3D 음향 효과가 없으며 플레이어 간에 간단한 인터랙션만 가능합니다. 3D 음향 효과로 플레이어는 말을 하는 동안 자신의 방향과 위치 정보를 노출할 수 있으며 거리에 따라 목소리가 실시간으로 변할 수 있습니다. 3D 음향 효과 기능은 <배틀 로얄 게임>에서 플레이어에게 보다 사실적이고 몰입감 있는 커뮤니케이션 및 전투 경험을 제공합니다.
demo 다운로드를 클릭하여 3D 음향 효과 기능을 사용해 볼 수 있습니다.

전제 조건

음성 채팅 서비스 활성화: 음성 서비스 활성화 가이드를 참고하십시오.
GME SDK 통합: 핵심 API 및 음성 채팅 API를 포함한 GME SDK를 통합 완료해야 합니다. 자세한 내용은 Native SDK 빠른 통합, Unity SDK 빠른 통합Unreal SDK 빠른 통합을 참고하십시오.

구현 프로세스

구현 순서도

3D 음향 효과 구현 순서도는 다음과 같습니다. 파란색 부분은 방 입장을 위한 일반 음성 채팅과 비교하여 새로운 통합 단계입니다.




3D 음향 효과 엔진 초기화

이 함수는 3D 음향 효과 엔진을 초기화하는 데 사용되며 방 입장 후 호출해야 합니다. 3D 음향 효과 재생이 아닌 3D 음향 효과 수신만 가능하게 하고 싶은 경우에도 3D 음향 효과 사용 전에 이 API를 호출해야 합니다.

함수 프로토타입

public abstract int InitSpatializer(string modelPath)
매개변수
유형
설명
modelPath
string
3D 음향 효과 리소스 파일의 절대 경로
3D 음향 효과 리소스 파일을 로컬 디스크에 다운로드해야 합니다. SDK 버전에 따라 하나를 선택하십시오.
v2.8 이전 SDK의 경우 여기를 클릭하여 다운로드하십시오(md5 값: d0b76aa64c46598788c2f35f5a8a8694).
v2.8-v2.9.5 SDK의 경우 여기를 클릭하여 다운로드하십시오(md5 값: 3d4d04b3949e267e34ca809e8a0b9243).
v2.9.6 이상 버전인 경우 3D 음향 효과 리소스 파일이 이미 내장되어 있으므로 여기에 modelPath를 입력할 수 있습니다.
GME SDK 릴리스 업데이트는 제품 업데이트를 참고하십시오.
리소스 경로 정보
Unity를 예로 들면 3D 음향 효과 리소스 파일을 프로젝트의 StreamingAssets 디렉터리에 넣고 SampleCode의 copyFileFromAssetsToPersistent 함수 내용에 따라 다른 플랫폼의 해당 디렉터리에 복사하는 것이 좋습니다.
Unreal Engine을 예로 들어 3D 모델 파일을 복사하고 SampleCode의 CopyAllAssetsToExternal 함수 내용을 기반으로 경로를 읽습니다.

3D 음향 효과 활성화/비활성화

이 함수는 3D 음향 효과를 활성화하거나 비활성화하는 데 사용됩니다. 활성화 후 3D 사운드를 들을 수 있습니다.

함수 프로토타입

public abstract int EnableSpatializer(bool enable, bool applyToTeam)
매개변수
유형
설명
enable
bool
활성화하면 3D 음향 효과를 들을 수 있습니다
applyToTeam
bool
팀 내 3D 음향 효과 활성화 여부를 지정합니다. enable이 true인 경우에만 적용됩니다.

3D 음향 효과 상태 가져오기

이 함수는 3D 음향 효과의 상태를 얻기 위해 사용됩니다.

함수 프로토타입

public abstract bool IsEnableSpatializer()
반환 값
설명
true
활성화 상태
false
비활성화 상태

3D 음향 효과 감쇠 범위 설정

3D 음향 효과 감쇠 범위를 설정해야 합니다. 100으로 설정하는 것이 좋습니다.

거리와 사운드 감쇠의 관계

3D 음향 효과에서 음원까지의 거리가 지정된 임계값(range/10)을 초과하면 볼륨이 거의 0으로 감쇠되기 시작합니다.
거리 범위(엔진 단위)
감쇠 공식
0 < N < range/10
감쇠 계수: 1.0(볼륨 감쇠 없음)
N ≥ range/10
감쇠 계수: range/10/N




함수 프로토타입

public abstract void UpdateAudioRecvRange(int range)
매개변수
유형
설명
range
int
게임 엔진에서 사용하는 거리 단위로 음향 효과를 들을 수 있는 범위입니다. 100으로 설정하는 것이 좋습니다.

음원 위치 업데이트(방향 포함)

이 함수는 음원의 위치 정보를 업데이트하는 데 사용됩니다. 3D 음향 효과를 구현하기 위해 모든 프레임을 호출할 수 있습니다.

함수 프로토타입

public abstract int UpdateSelfPosition(int position[3], float axisForward[3], float axisRight[3], float axisUp[3])
매개변수
유형
설명
position
int[]
세계 좌표계에서 로컬 위치(전방, 오른쪽, 위)
axisForward
float[]
로컬 좌표계의 전방 벡터
axisRight
float[]
로컬 좌표계의 오른쪽 벡터
axisUp
float[]
로컬 좌표계의 위쪽 벡터

예시 코드

Unreal
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);
Unity
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(VR 시나리오용)

이 API는 VR 장치에서 3D 위치 변경에 대한 요구 사항이 높은 시나리오에 적합합니다. 이 기능은 고급 API이며 GME 2.9.2 이상에서만 사용할 수 있습니다.
일반적인 3D 시나리오에서 사용자는 UpdateSelfPosition 함수를 사용하여 위치 정보를 업데이트하고 네트워크를 통해 다른 사용자에게 전송하기만 하면 됩니다. UpdateOtherPosition은 네트워크를 사용하지 않고 로컬에서 다른 플레이어의 위치 정보를 전달할 수도 있으므로 VR 게임 시나리오에 적합합니다.
원격으로 업데이트된 좌표와의 충돌을 피하기 위해 UpdateOtherPosition을 호출하면 원격 좌표가 삭제되어 다음 방 입장에 영향을 미칩니다. 따라서 로컬에서 플레이어 좌표를 업데이트하려면 모든 플레이어의 좌표를 업데이트해야 합니다.

함수 프로토타입

public abstract int UpdateOtherPosition(int position[3])
매개변수
유형
설명
position
int[]
원격 위치. 좌표 순서는 전방, 오른쪽, 위
주의사항:
플레이어 좌표를 로컬에서 업데이트하려면 모든 플레이어 좌표를 트래버스하고 이 API를 통해 전달합니다.

3D 음향 효과 블록리스트 API

주의사항:
이 API는 GME SDK 2.9.3 이상에서 적용됩니다.
현재 3D 음향 효과 기능은 호출 후 방에 있는 모든 사용자에게 적용됩니다. 그러나 일부 특수 시나리오에서는 3D 음향 효과로 인해 누군가의 목소리가 약해지는 것을 원치 않을 수 있습니다. 이 경우 이 API를 호출하여 3D 음향 효과 블록리스트에 사용자를 추가할 수 있으며 지정된 openid의 음성에는 더 이상 3D 음향 효과가 적용되지 않습니다.
virtual int AddSpatializerBlacklist(const char* openId);
블록리스트에서 openid를 제거하려면 다음 API를 호출해야 합니다.
virtual int RemoveSpatializerBlacklist(const char* openId);
블록리스트를 지우려면 다음 API를 호출해야 합니다.
virtual int ClearSpatializerBlacklist();

문제 해결

이 기능을 연결한 후 음성에 3D 음향 효과가 없으면 다음과 같이 문제를 해결할 수 있습니다.
1. 사용자가 방에 성공적으로 입장했는지, 마이크를 켰는지, 서로의 말을 들을 수 있는지 확인합니다.
2. 스테레오 헤드셋이 사용되는지 확인합니다.
3. InitSpatializer의 반환 값이 0인지 확인합니다.
4. UpdateAudioRecvRange 값이 너무 작은지 확인합니다.
5. UpdateSelfPosition API가 주기적으로 호출되는지 확인합니다.
6. 에러 코드를 참고하여 문제를 해결하십시오.

도움말 및 지원

문제 해결에 도움이 되었나요?

피드백