tencent cloud

フィードバック

Unreal Sample Projectのクイックスタート

最終更新日:2024-01-18 15:42:47
    このドキュメントでは、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);
    }
    
    
    お問い合わせ

    カスタマーサービスをご提供できるため、ぜひお気軽にお問い合わせくださいませ。

    テクニカルサポート

    さらにサポートが必要な場合は、サポートチケットを送信して弊社サポートチームにお問い合わせください。24時間365日のサポートをご提供します。

    電話サポート(24 時間365日対応)