このドキュメントでは、GME Unreal Sample Projectをすばやく実行し、プロジェクトにプロジェクトサンプルコードを導入する方法について説明します。
Unreal Sample Projectのクイックスタート
環境要件
UnrealEngine 4.22以降のバージョンを推奨します。
Microsoft Visual Studio。
UnrealEngineプロジェクトを実行できる構成環境。
前提条件
事前にGMEリアルタイム音声、音声メッセージサービスを有効化し、AppIdとKeyを取得してください。GMEサービスの有効化については、サービスの有効化をご参照ください。appIdはコンソールのAppID、authKeyはコンソールの秘密鍵に対応します。 操作手順
ステップ1:プロジェクトのダウンロード
ダウンロードガイドでUnreal Sample Projectをダウンロードしてください。UE5とUE4ではDemoの設定が異なるため、対応するエンジンバージョンのSample Projectをダウンロードする必要があります。 ステップ2:プロジェクトの設定
ダウンロード後にプロジェクトディレクトリを開き、パスSource\\UEDemo1からUserConfig.cppを探し、図中の赤枠内のappID及びappKeyを申請したGMEコンソールサービス管理-アプリケーション設定のAppID及び権限キーに変更します。 ステップ3:コンパイルと実行
1)プログラムの実行
「エディタを実行」ボタンをクリックして、実行プログラムに移行します。 2)初期化
UserID:openIDに相当します。openIDはアプリケーション内でユーザを識別する唯一の識別子です。各端末で一意のopenidを確保しなければなりません。
Voice Chat:リアルタイム音声機能インターフェース。
Voice Message:音声メッセージ機能のインターフェース。
Loginをクリックして初期化を行い、Voice Chatをクリックしてリアルタイムボイスルームの設定画面を開きます。
3)リアルタイム音声ルームへ参加
RoomId:部屋番号です。同じルームのメンバーが音声で話すことができます。
RoomType:Fluencyを使用してルームに参加してください。
JoinRoom:音声ルームに参加します。
Back:前の画面に戻ります。
リアルタイムボイスルーム番号を設定したら、JoinRoomをクリックして、リアルタイムボイスルームに入ります。
4)リアルタイム音声機能
ルームに参加したRoomidとローカル端末のopenidが画面に表示されます。
Mic:マイクをオンにします。
Speaker:スピーカーをオンにします。
3D Voice Effect:3Dサウンドをオンにします。
Voice Change:ボイス・チェンジエフェクトを選択します。
ローカル端末でMicおよびSpeakerにチェックを入れ、もう一方の端末の機器も以上の手順を繰り返し、同じルームに参加し、MicおよびSpeakerにチェックを入れ、互いにコミュニケーションを行うことができます。
両端末とも3D Voice Effectにチェックを入れ、キーボード【A】【S】【D】【W】で方位を変え、3D音声方位感を体験できます。
5)音声メッセージ機能
Language:テキスト変換対象音声を選択し、例えば中国語を話す場合は北京語を選択します。
Audio:録音後にクリックすると聴くことができます。
Audio-to-Text:音声から変換されるテキスト内容。
Push To Talk:長押しすると録音できます。
Back:前の画面に戻ります。
Push to Talkボタンを長押ししたままマイクに向かって話しかけ、ボタンを離すと音声がテキストに変換されて画面に表示されます。
Sample Projectコードの説明
GMEリアルタイム音声を利用する主な手順は、Init>EnterRoom>EnableMic>EnableSpeakerです。Sample Projectの主なコードは、BaseViewController.cppおよびExperientialDemoViewController.cppにあります。
初期化関連
初期化に関連するコードは、BaseViewController.cppファイルのInitGME関数にあります。これには、初期化、音声メッセージの認証初期化、およびコールバックTMGDelegateの設定が含まれます。
int UBaseViewController::InitGME(std::string sdkAppId, std::string sdkAppKey, std::string userId) {
int nAppid = atoi(sdkAppId.c_str());
int ret = ITMGContextGetInstance()->Init(sdkAppId.c_str(), userId.c_str());
ITMGContextGetInstance()->SetTMGDelegate(this);
int RetCode = (int) ITMGContextGetInstance()->CheckMicPermission();
FString msg = FString::Printf(TEXT("check Permission retcode =%d"), RetCode);
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Yellow, *msg);
char strSig[128] = {0};
unsigned int nLength = 128;
nLength = QAVSDK_AuthBuffer_GenAuthBuffer(nAppid, "0", userId.c_str(), sdkAppKey.c_str(), (unsigned char *)strSig, nLength);
ITMGContextGetInstance()->GetPTT()->ApplyPTTAuthbuffer(strSig, nLength);
m_appId = sdkAppId;
m_appKey = sdkAppKey;
m_userId = userId;
m_isEnableTips = false;
m_tipsMark = 0;
return ret;
}
GMEを使用するにはPoll関数を定期的に呼び出してください。UEDemoLevelScriptActor.cppスクリプトのTickで呼び出されます。
void AUEDemoLevelScriptActor::Tick(float DeltaSeconds) {
Super::Tick(DeltaSeconds);
m_pTestDemoViewController->UpdateTips();
m_pCurrentViewController->UpdatePosition();
ITMGContextGetInstance()->Poll();
}
入室関連
入室関連のコードは、BaseViewController.cppファイルのEnterRoom関数にあります。
void UBaseViewController::EnterRoom(std::string roomID, ITMG_ROOM_TYPE roomType) {
int nAppid = atoi(m_appId.c_str());
UserConfig::SetRoomID(roomID);
char strSig[128] = {0};
unsigned int nLength = 128;
nLength = QAVSDK_AuthBuffer_GenAuthBuffer(nAppid, roomID.c_str(), m_userId.c_str(), m_appKey.c_str(), (unsigned char *)strSig, nLength);
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Yellow, TEXT("onEnterRoom"));
ITMGContextGetInstance()->EnterRoom(roomID.c_str(), roomType, strSig, nLength);
}
入室のコールバックは同じスクリプト内のOnEvent関数中にあります。
if (eventType == ITMG_MAIN_EVENT_TYPE_ENTER_ROOM) {
int32 result = JsonObject->GetIntegerField(TEXT("result"));
FString error_info = JsonObject->GetStringField(TEXT("error_info"));
if (result == 0) {
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 20.0f, FColor::Yellow, TEXT("Enter room success."));
}
else{
FString msg = FString::Printf(TEXT("Enter room failed. result=%d, info = %ls"), result, *error_info);
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 20.0f, FColor::Yellow, *msg);
}
onEnterRoomCompleted(result, error_info);
デバイスをオンにする
正常に入室すると、デバイスをオンにします。関連コードはExperientialDemoViewController.cppにあります。
void UExperientialDemoViewController::onCheckMic(bool isChecked) {
//GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Yellow, L"onCheckMic");
ITMGContext *pContext = ITMGContextGetInstance();
if (pContext) {
ITMGAudioCtrl *pTmgCtrl = pContext->GetAudioCtrl();
if (pTmgCtrl) {
pTmgCtrl->EnableMic(isChecked);
}
}
}
void UExperientialDemoViewController::onCheckSpeaker(bool isChecked) {
//GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Yellow, L"onCheckSpeaker");
ITMGContext *pContext = ITMGContextGetInstance();
if (pContext) {
ITMGAudioCtrl *pTmgCtrl = pContext->GetAudioCtrl();
if (pTmgCtrl) {
pTmgCtrl->EnableSpeaker(isChecked);
}
}
}
3Dサウンド関連
3Dサウンドの導入について、3Dサウンドドキュメントをご参照ください。プロジェクトでは、まず3Dサウンド機能が初期化され、関連コードはExperientialDemoViewController.cppにあります。 void UExperientialDemoViewController::onCheckSpatializer(bool isChecked) {
char buffer[256]={0};
// snprintf(buffer, sizeof(buffer), "%s3d_model", getFilePath().c_str());
snprintf(buffer, sizeof(buffer), "%sgme_2.8_3d_model.dat", getFilePath().c_str());
int ret1 = ITMGContextGetInstance()->GetAudioCtrl()->InitSpatializer(buffer);
int ret2 = ITMGContextGetInstance()->GetAudioCtrl()->EnableSpatializer(isChecked, false);
FString msg = FString::Printf(TEXT("InitSpatializer=%d, EnableSpatializer ret=%d"), ret1, ret2);
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Yellow, msg);
}
UEDemoLevelScriptActor.cppスクリプトのTickでUpdatePosition関数が呼び出されます。
void AUEDemoLevelScriptActor::Tick(float DeltaSeconds) {
Super::Tick(DeltaSeconds);
m_pTestDemoViewController->UpdateTips();
m_pCurrentViewController->UpdatePosition();
ITMGContextGetInstance()->Poll();
}
void UBaseViewController::UpdatePosition() {
if (!m_isCreated)
return;
ITMGRoom *pTmgRoom = ITMGContextGetInstance()->GetRoom();
if (!pTmgRoom)
{
return;
}
int nRange = GetRange();
pTmgRoom->UpdateAudioRecvRange(nRange);
FVector cameraLocation = UGameplayStatics::GetPlayerCameraManager(m_pActor->GetWorld(), 0)->GetCameraLocation();
FRotator cameraRotation = UGameplayStatics::GetPlayerCameraManager(m_pActor->GetWorld(), 0)->GetCameraRotation();
FString msg = FString::Printf(TEXT("location(x=%.2f,y=%.2f,z=%.2f), rotation(pitch=%.2f,yaw=%.2f,roll=%.2f)"),
cameraLocation.X, cameraLocation.Y, cameraLocation.Z, cameraRotation.Pitch, cameraRotation.Yaw, cameraRotation.Roll);
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 };
pTmgRoom->UpdateSelfPosition(position, forward, right, up);
SetPositionInfo(msg);
}
ExperientialDemoViewController.cppで3Dサウンドをオンにします。
void UExperientialDemoViewController::onCheckSpatializer(bool isChecked) {
char buffer[256]={0};
// snprintf(buffer, sizeof(buffer), "%s3d_model", getFilePath().c_str());
snprintf(buffer, sizeof(buffer), "%sgme_2.8_3d_model.dat", getFilePath().c_str());
int ret1 = ITMGContextGetInstance()->GetAudioCtrl()->InitSpatializer(buffer);
int ret2 = ITMGContextGetInstance()->GetAudioCtrl()->EnableSpatializer(isChecked, false);
FString msg = FString::Printf(TEXT("InitSpatializer=%d, EnableSpatializer ret=%d"), ret1, ret2);
GEngine->AddOnScreenDebugMessage(INDEX_NONE, 10.0f, FColor::Yellow, msg);
}
この記事はお役に立ちましたか?