> 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/kr/ggwp-sdk/integration-guide/unreal.md).

# Unreal

**초기 설정**

SDK가 오디오를 캡처할 수 있도록 하려면 먼저 다음을 호출하여 초기화해야 합니다:

{% code overflow="wrap" %}

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

{% endcode %}

초기화가 성공하면 코드 인증(권장) 또는 정적 키 기반 인증(더 간단하고 설정이 쉬움) 중 하나로 인증하세요.

**Vivox**

언리얼 플러그인은 자체 구성하려고 시도합니다. 만약 `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` 를 사용하실 수 있습니다.

작동 예시는 언리얼 샘플 앱을 참조하세요.<br>

**EOS 음성**

EOS 전용 코드는 다음이 `OnlineSubsystemEOS` 플러그인이 uproject 파일에 존재하고 활성화되어 있으면 자동으로 빌드됩니다.

세션 시작은 다른 모든 함수를 호출하기 위한 전제 조건이므로 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 %}

#### 디스코드 SDK

GGWP SDK가 음성 채널의 오디오를 캡처할 수 있도록 하려면 다음을 호출해야 합니다

{% code overflow="wrap" %}

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

{% endcode %}

이 래퍼는 콜백이 올바르게 연결되고 오디오가 올바른 형식으로 전달되도록 보장합니다. 직접 음성 캡처 콜백에 바인드해야 하는 경우에는 동일한 패턴을 따르며 오디오를 직접 큐에 넣으세요, `StartCall` 래퍼와 같은 방식으로.

자세한 내용은 디스코드 예제 앱을 참조하세요.
