tencent cloud

피드백

3D 음향 효과

마지막 업데이트 시간: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. 에러 코드를 참고하여 문제를 해결하십시오.
    문의하기

    고객의 업무에 전용 서비스를 제공해드립니다.

    기술 지원

    더 많은 도움이 필요하시면, 티켓을 통해 연락 바랍니다. 티켓 서비스는 연중무휴 24시간 제공됩니다.

    연중무휴 24시간 전화 지원