tencent cloud

Game Multimedia Engine

製品アップデート情報
製品紹介
製品概要
優位性のある特徴
製品機能
ユースケース
セキュリティコンプライアンス認証
初心者ガイド
SDKダウンロードガイド
製品機能体験
基本機能Demo
シーン化体験
コンソールガイド
使用量の表示
サービスの有効化
クイックスタート
Quick Integration of SDK
Quick Integration of Sample Project
基本機能開発ガイド
Authentication Key
リアルタイム音声ロール設定
音質設定
拡張機能開発ガイド
サーバー側のレコーディング
レンジボイス
3Dサウンド
効果音と伴奏
ネットワークオーディオストリーム転送ルーティング
カスタムメッセージチャネル
社内ファイアーフォール制限への対応について
Language Parameter Reference List
GMEルーム管理機能の導入
クライアントAPI
SDK for Unity
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
よくある質問
製品機能質問
問題解決ガイド
課金について
Sample Projectの使用上の問題
一般的な質問
認証について
リアルタイム音声ルーム参加失敗について
リアルタイム音声利用時に音声が聞こえない問題とオーディオ関連について
ネットワークについて
ボイス・ツー・テキスト変換について
プロジェクトエクスポートについて
Service Agreement
Service Level Agreement
お問い合わせ
用語集
GME ポリシー
データ処理とセキュリティ契約
プライバシーポリシー

3Dサウンド

PDF
フォーカスモード
フォントサイズ
最終更新日: 2024-01-18 15:47:47
開発者がTencent Cloud GME製品のAPIを容易にデバッグして導入するために、このドキュメントではGME 3D効果音の導入技術を紹介します。

シナリオ

通常の入室後のリアルタイム音声では、プレイヤーの音声に3D効果音の効果がなく、プレイヤーの間ではとても簡単なコラボライブを行うことしかできません。一方、3D位置音声を導入した後は、プレーヤーが呼びかけると自分の方位と位置情報を開示し、プレーヤーの音声も位置の変化によってリアルタイムで変化するようになっています。3D効果音は、「大逃殺」のようなプレイヤー間のコミュニケーションや戦闘体験をよりリアルにし、PUBGのように、より没入的で臨場感のある遊び方を体感できるようになったと言えます。
demoのダウンロードをクリックして、3D効果音を体験できます。

前提条件

リアルタイム音声サービスが有効になっていること音声サービス有効化ガイドをご参照ください。
GME SDK導入済み:コアインターフェースとリアルタイム音声インターフェースの導入を含みます。詳細については、Native SDKクイックスタートUnity SDKクイックスタートUnreal SDKクイックスタートをご参照ください。

実装プロセス

実装フローチャート

次の図は3D効果音を実装するフローチャートです。青い部分は通常の入室リアルタイム音声と比較した導入ステップです。




3D効果音エンジンの初期化

この関数は、3Dサウンドエフェクトエンジンを初期化するために使用され、入室した後に呼び出します。このインターフェイスは、3Dサウンドエフェクトを使用する前に呼び出す必要があります、3Dサウンドエフェクトを送信せず受信するのみのユーザーでも、このインターフェイスを呼び出す必要があります。

関数のプロトタイプ

public abstract int InitSpatializer(string modelPath)
パラメータ
タイプ
意味
modelPath
string
3D効果音のリソースファイルの絶対パス
パラメーター内の3D効果音リソースファイルは、別途ローカルにダウンロードしてください。導入するSDKのバージョンによって区別されます。
v2.8以降のバージョンの場合は、ダウンロードをクリックしてください、。md5: d0b76aa64c46598788c2f35f5a8a8694。
v2.8~v2.9.5の場合は、ダウンロードをクリックしてください、。md5: 3d4d04b3949e267e34ca809e8a0b9243。
v2.9.6以降のバージョンの場合は、3D効果音のリソースファイルが組み込まれているので、ここのmodelPathを空にすることができます。
SDKのバージョンリリース履歴については製品の最新情報をご参照ください。
リソースパスについて
Unityの場合、プロジェクトのStreamingAssetsディレクトリに3Dファイルを配置し、SampleCodeのcopyFileFromAssetsToPersistent関数を参照して、リソースファイルを各プラットフォームの適切なディレクトリにコピーすることをお勧めします。
Unrealの場合、SampleCodeのCopyAllAssetsToExternal関数を参照して、3Dモデルファイルをコピーしてからパスを読み込みます。

3D効果音のオン/オフ

この関数は、3Dサウンドエフェクトをオン/オフにするために使用されます。オンにした後、3Dサウンドエフェクトが聞こえます。

関数のプロトタイプ

public abstract int EnableSpatializer(bool enable, bool applyToTeam)
パラメータ
タイプ
意味
enable
bool
オンにすると3D効果音が聞こえます
applyToTeam
bool
3D音声はチーム内で機能するかどうかを示します。enbleがtrueである場合にのみ有効です。

現在の3D効果音状態の取得

この関数は、現在の3Dサウンドエフェクトの状態を取得するために使用されます。

関数のプロトタイプ

public abstract bool IsEnableSpatializer()
戻り値
意味
true
起動状態
false
オフ状態

3D効果音の減衰距離の設定

減衰距離を設定する必要があります。推奨値は100です。

距離と音声減衰の関係

3Dサウンドエフェクトでは、音源のボリュームは音源の距離と減衰関係にあります。単位距離がrangeを超えた後、ボリュームはほぼゼロまで減衰します。
距離範囲(エンジン単位)
減衰公式
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);

ローカル方位のインターフェース(VRシーン)

このインターフェースはVRデバイスの中でも、3Dの位置変化が非常に求められるシーンに適しています。この機能は高度なインターフェースであり、GME2.9.2以降が必要です。
通常の3Dシーンでは、ユーザーが単にUpdateSelfPosition関数を使用して自分の位置情報を更新し、ネットワークを介して他のユーザーに送信することができます。UpdateOtherPositionは他のプレイヤーの位置情報をネットワークを経由せずに、ローカルから送信することができ、VRゲームシーンに適しています。
リモートで更新された座標との競合を避けるために、UpdateOtherPositionを呼び出すと、リモート座標は破棄され、その影響は再びルームに入るまで残ります。したがって、プレイヤーの座標をローカルに更新する場合は、すべてのプレイヤーの座標を更新してください

関数のプロトタイプ

public abstract int UpdateOtherPosition(int position[3])
パラメータ
タイプ
意味
position
int[]
世界座標での他のプレーヤーの座標であり、順序は前、右、上です
ご注意:
プレイヤーの座標をローカルに更新する場合は、すべてのプレイヤーの座標をトラバーサルし、このインターフェースを使用して座標を渡してください。

3D音声のブラックリストインターフェース

ご注意:
このインターフェースはGME2.9.3以降のSDKで有効になります。
現在、3D効果音を呼び出すとルーム内のすべての人に効果があります。特定のシーンでは、受信した人の音声が3D効果音によって減衰することが望ましくない場合、このインターフェースを呼び出すことで、その人を3D効果音ブラックリストに追加することができます。追加したら、このopenidの音声は3D効果音の影響を受けなくなります。
virtual int AddSpatializerBlacklist(const char* openId);
このopenidをブラックリストから削除する必要がある場合は、次のインターフェースを呼び出してください。
virtual int RemoveSpatializerBlacklist(const char* openId);
ブラックリストを空にする必要がある場合は、次のインターフェースを呼び出してください。
virtual int ClearSpatializerBlacklist();

トラブルシューティング

接続後に音声をテストしても3D効果音がない場合は、次の手順に従って確認してください:
1. 正常にルームに参加したか、マイクをオンにしたか?両方が声が聞こえるか?
2. デュアルチャネルヘッドセットに適しているか?
3. InitSpatializerインターフェースの戻り値は0か?
4. UpdateAudioRecvRangeの設定が小さすぎないか?
5. UpdateSelfPositionインターフェースが定期的に呼び出されたか?
6. エラーコードドキュメントを使用して判断、解決します。

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック