> For the complete documentation index, see [llms.txt](https://docs.ggwp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ggwp.com/chinese-simplified/ggwp-ke-hu-duan-sdk/ji-cheng-zhi-nan/unreal.md).

# Unreal

**初始设置**

在 SDK 能够捕获音频之前，您必须通过调用以下内容来初始化它：

{% code overflow="wrap" %}

```csharp
FGGWPSDKModule& GgwpSDK = FModuleManager::Get().LoadModuleChecked<FGGWPSDKModule>(TEXT("GGWPSDK"));
GgwpResult Result = GgwpSDK.InitializeSDK("YOUR_CUSTOMER_ID");
```

{% endcode %}

成功初始化后，请使用 Code Auth（推荐）或基于静态密钥的认证（更简单、设置更容易）进行授权。

**Vivox**

Unreal 插件将尝试自动配置。如果 `VivoxCore` 是项目 uproject 文件中存在且已启用的插件，GGWP 插件将构建 Vivox 特定的辅助函数。请务必在 `VivoxCore` 中包含 `${project}.uproject` 以确保构建 Vivox 配置函数。

请尽早初始化并授权 GGWP SDK：

{% code overflow="wrap" %}

```csharp
FGGWPSDKModule& GgwpSDK = FModuleManager::Get().LoadModuleChecked(TEXT("GGWPSDK"));
GgwpResult InitResult = GgwpSDK.InitializeSDK("YOUR_CUSTOMER_ID");
```

{% endcode %}

然后使用动态令牌：

{% code overflow="wrap" %}

```csharp
GgwpSDK.GetAuthManager()->SubscribeAuthUpdates(
    FAuthUpdatesDelegate::FDelegate::CreateLambda([](const GGWP::AuthStatus& AuthStatus) {
			UE_LOG(LogTemp, Display, TEXT("Auth status is %d"), AuthStatus.Status);
    })
);

// 执行认证
FAuthCompletionDelegate AuthCompletion;
AuthCompletion.BindLambda([this, AuthPromise](GgwpResult Result) {
	UE_LOG(LogTemp, TEXT("Auth completion status: %d"), Result);
});

FString CorrectCode = FetchCode();
AuthManager->ExchangeAuthCode(CorrectCode, AuthCompletion);
```

{% endcode %}

或者静态

{% code overflow="wrap" %}

```csharp
FAuthCompletionDelegate AuthCompletion;
AuthCompletion.BindLambda([this, AuthPromise](GgwpResult Result) {
	UE_LOG(LogTemp, TEXT("Auth completion status: %d"), Result);
});

AuthManager->SetStaticAuth("SomeKey", "SomeSigningKey", AuthCompletion);
```

{% endcode %}

登录成功后，您可以开始将语音数据块发送到 SDK：

{% code overflow="wrap" %}

```csharp
VivoxVoiceClient = &static_cast<FVivoxCoreModule *>(&FModuleManager::Get().LoadModuleChecked(TEXT("VivoxCore")))->VoiceClient();
auto DefaultConfig = VivoxConfig();

// 这将为您自动绑定捕获回调。
// 如果您自己将回调绑定到 Vivox，请绑定
// FGGWPSDKodule::VivoxBeforeCaptureAudioSent 到 `pf_on_audio_unit_before_capture_audio_sent`。
GgwpResult ConfigBindResult = GgwpSDK->BindCaptureCallback(DefaultConfig);
VivoxVoiceClient->Initialize(DefaultConfig);
```

{% endcode %}

您可以依赖 GGWPSDK 自带的日志功能，它会记录到 `GGWPSDK` 日志组，或者您也可以绑定自己的委托：

{% code overflow="wrap" %}

```csharp
GgwpSDK->GetLogDelegate().AddStatic(&FMyVoiceChatModule::LogMessage);
```

{% endcode %}

强烈建议这样做，因为这些日志消息包含了许多有关 SDK 运行的重要有用信息。您可以使用 `FGGWPLogMessage::StatusCode` 在代码中对这些状态做出响应。

请参阅 Unreal 示例应用以查看可运行的示例。<br>

**EOS 语音**

如果 `OnlineSubsystemEOS` 插件存在且在 uproject 文件中已启用，则会自动构建 EOS 特定代码。

请尽早初始化 GGWPSDK，因为启动会话是调用所有其他函数的前提。一旦 EOS 用户加入语音聊天频道，请调用 `BindCaptureCallback` 以自动连接音频处理器。

{% code overflow="wrap" fullWidth="false" %}

```csharp
auto GgwpSDK = static_cast<FGGWPSDKModule *>(&FModuleManager::Get().LoadModuleChecked(TEXT("GGWPSDK")));
GgwpResult StartResult = GgwpSDK->StartSession("unrealsession", "unrealuser", FGGWPSDKModule::FCustomerAuthParams {
	"unrealtestcustomer",
	GGWP_AUTH_KEY,
	GGWP_SIGNING_KEY
});

//
// 省略，加入语音
//

IVoiceChatUser* VoiceChatUser = EOSSubsystem->GetVoiceChatUserInterface(*NetId);

if (!VoiceChatUser) {
    UE_LOG(LogTemp, Error, TEXT("Cannot get VoiceChatUser"));
    return;
}

GgwpSDK->BindCaptureCallback(VoiceChatUser);
```

{% endcode %}

#### Discord SDK

为了让 GGWP SDK 能够捕获语音频道的音频，您需要调用

{% code overflow="wrap" %}

```csharp
FGGWPSDKModule& GgwpSDK = FModuleManager::Get().LoadModuleChecked<FGGWPSDKModule>(TEXT("GGWPSDK"));
GgwpSDK.StartCall(DiscordClient, "MyLobbyId");
```

{% endcode %}

此包装器将确保回调以正确的方式连接，并且音频以正确的格式转发。如果您需要自己绑定语音捕获回调，请直接排队音频，并遵循与 `StartCall` 包装器相同的模式。

有关更多详细信息，请参阅 Discord 示例应用。
