PLUG UNREAL 적용 가이드

Quick Start

최신 버전 다운로드

다운로드한 샘플 프로젝트에 포함된 Plugins/CafeSDKPlugin 폴더를 프로젝트에 복사한 다음 운영체제에 따라 다음과 같이 개발 환경을 설정합니다.

2.1 Android 설정

다운로드한 샘플 프로젝트에 포함된 Build/Android 폴더에서 다음 파일과 폴더를 프로젝트에 복사합니다.

  • ManifestApplicationAdditions.txt

  • JavaLibs 폴

2.2 iOS 설정

DefaultEngine.ini 파일에 다음과 같이 프로젝트 설정을 추가합니다.

AdditionalLinkerFlags=-ObjC
AdditionalShippingLinkerFlags=-ObjC
AdditionalPlistData=<key>CFBundleURLTypes</key> <array>    <dict>            <key>CFBundleURLSchemes</key>           <array>               <string>gLinkSample</string>        </array>    </dict>   </array><key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict> <key>LSApplicationQueriesSchemes</key><array><string>navercafe</string><string>naversearchapp</string><string>naversearchthirdlogin</string></array>    <key>CFBundleURLTypes</key><array><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>gLinkSample</string></array></dict></array><key>NSPhotoLibraryUsageDescription</key><string>Access your photos to create a post.</string>

Build.cs 파일에 다음과 같이 프레임워크 설정을 추가합니다.

if (Target.Platform == UnrealTargetPlatform.IOS)
{
    // Add framework
    PublicAdditionalFrameworks.Add(
        new UEBuildFramework(
            "NaverCafeSDK",
            "../../ThirdPartyFrameworks/iOS/NaverCafeSDK.embeddedframework.zip",
            "Resources/NaverCafeSDK.bundle"
        )
    );
    PublicAdditionalFrameworks.Add(
        new UEBuildFramework(
            "NaverLogin",
            "../../ThirdPartyFrameworks/iOS/NaverLogin.embeddedframework.zip",
            "Resources/NaverAuth.bundle"
        )
    );
    PublicAdditionalFrameworks.Add(
        new UEBuildFramework(
            "AFNetworking",
            "../../ThirdPartyFrameworks/iOS/AFNetworking.embeddedframework.zip"
        )
    );
    PublicAdditionalFrameworks.Add(
        new UEBuildFramework(
            "SDWebImage",
            "../../ThirdPartyFrameworks/iOS/SDWebImage.embeddedframework.zip"
        )
    );
    PublicAdditionalFrameworks.Add(
        new UEBuildFramework(
            "FLAnimatedImage",
            "../../ThirdPartyFrameworks/iOS/FLAnimatedImage.embeddedframework.zip"
        )
    );
    PublicAdditionalFrameworks.Add(
        new UEBuildFramework(
            "ApiGateway",
            "../../ThirdPartyFrameworks/iOS/ApiGateway.embeddedframework.zip"
        )
    );

    PublicFrameworks.AddRange(
        new string[] {
            "UIKit",
            "Foundation",
            "MediaPlayer",
            "SystemConfiguration",
            "Security",
            "MobileCoreServices",
            "GameKit",
            "AssetsLibrary",
        }
    );
    PublicWeakFrameworks.Add("ReplayKit");
}

3. 초기화

PLUG SDK가 지원하는 언어에 따라 다음과 같이 PLUG SDK를 초기화합니다.

3.1 PLUG SDK 초기화(한국어만 지원 - 네이버 카페)

한국어만 지원하는 PLUG SDK를 초기화할 때는 다음과 같은 초기화 정보를 설정합니다.

if (FCafeSDKPluginModule::IsAvailable())
{
    UCafeSdkBlueprintLibrary::Init("U5ZHoj_OStOHOJ8mec_s", "piPHPA9i4E", 28334359);
}

3.2 PLUG SDK 초기화(외국어만 지원)

외국어만 지원하는 PLUG SDK를 초기화할 때는 다음과 같은 초기화 정보를 설정합니다.

  • PLUG SDK 제휴 신청을 통해 받은 컨슈머 키(Consumer Key) 와 컨슈머 시크릿(Consumer Secret)

  • PLUG SDK 제휴 신청을 통해 받은 Community No 와 Lounge No

  • consumerKey: 커뮤니티를 개설하고 받은 컨슈머 키(Consumer Key)

  • consumerSecretKey: 커뮤니티를 개설하고 받은 컨슈머 시크릿(Consumer Secret Key)

  • cummunityNo: 커뮤니티를 개설하고 받은 커뮤니티 No(cummunityNo)

  • loungeNo: 라운지를 개설하고 받은 라운지 No(cummunityNo)

if (FCafeSDKPluginModule::IsAvailable())
{
    /**
     * @param consumerKey       컨슈머 키
     * @param consumerSecretKey 컨슈머 시크릿 키 
     * @param communityNo       커뮤니티 번호
     * @param loungeNo          라운지 번호                      
     */
     UCafeSdkBlueprintLibrary::InitGlobal("PLUGKEY", "PLUGSECRET", 1, 58);
}

4. PLUG SDK 시작

초기화가 완료되면 PLUG SDK를 실행합니다.

4.1 StartHome() 메서드

StartHome() 메서드는 PLUG SDK를 시작하는 메서드입니다.

UFUNCTION(BlueprintCallable, Category = "Naver CafeSdk")
static void StartHome();

4.2 ShowWidgetWhenUnloadSdk() 메서드

ShowWidgetWhenUnloadSdk() 메서드 PLUG SDK에서 접기 버튼을 눌렀을 때 위젯이 화면에 노출되도록 설정하는 메서드입니다.

UFUNCTION(BlueprintCallable, Category = "Naver CafeSdk")
static void ShowWidgetWhenUnloadSdk(bool bUse);

4.3 SetUseVideoRecord() 메서드

SetUseVideoRecord() 메서드는 PLUG SDK 위젯에 동영상 녹화 버튼을 노출하도록 설정하는 메서드입니다 (iOS 9.0 이상).

UFUNCTION(BlueprintCallable, Category = "Naver CafeSdk")
static void SetUseVideoRecord(bool bUse);

4.4 콜백 델리게이트

콜백 델리게이트를 설정해 PLUG SDK에서 발생하는 사용자 이벤트를 콜백 함수로 전달합니다.

콜백 델리게이트를 통해 호출되는 메서드로 PLUG SDK 실행/종료, 글작성(이미지/동영상 첨부 개수), 가입, 댓글 작성, 투표 등을 실행할 수 있습니다.

static FOnCafeSdkStarted OnCafeSdkStarted;
static FOnCafeSdkStopped OnCafeSdkStopped;
static FOnCafeSdkClickAppSchemeBanner OnCafeSdkClickAppSchemeBanner;
static FOnCafeSdkJoined OnCafeSdkJoined;
static FOnCafeSdkPostedArticle OnCafeSdkPostedArticle;
static FOnCafeSdkPostedComment OnCafeSdkPostedComment;
static FOnCafeSdkRecordFinish OnCafeSdkRecordFinish;
static FOnCafeSdkDidVote OnCafeSdkDidVote;

글로벌 커뮤니티와 국내 네이버 카페를 지원하는 플러그의 초기화

글로벌 커뮤니티와 국내 네이버 카페를 모두 지원할 때는 글로벌 커뮤니티를 지원하기 위한 초기화와 국내 네이버 카페를 지원하기 위한 초기화를 모두 설정한다.

기본 채널 설정

플러그의 언어별 커뮤니티인 채널의 기본 채널은 기기에 설정된 언어로 설정된다.

다음은 기본 채널을 특정한 언어로 설정한 예다.

void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
    AGameMode::InitGame(MapName, Options, ErrorMessage);
    if (FCafeSDKPluginModule::IsAvailable())
    {
        UCafeSdkBlueprintLibrary::SetChannelCode("en");
        ...
    }
}

플러그 시작과 종료

플러그를 특정한 탭이 선택된 상태로 시작하거나 플러그를 종료한다.

StartHome() 메서드

홈 탭이 선택된 상태로 플러그를 시작한다.

static void StartHome()

다음은 StartHome() 메서드를 구현한 예다.

   /**
   * 홈 탭으로 시작
   */
    UFUNCTION(BlueprintCallable, Category = "Naver CafeSdk")
    static void StartHome();

가로 모드, 세로 모드

플러그는 가로 모드와 세로 모드를 모두 지원한다.

Android

Android 환경에서는 별도로 설정하지 않아도 화면의 가로, 세로 상태에 따라 가로 모드, 세로 모드가 자동으로 적용된다.

iOS

iOS 환경에서는 setOrientationIsLandscape: 메서드로 가로 모드와 세로 모드를 적용한다.

다음은 플러그를 가로 모드로 실행하는 예다.

//기본값은 YES
//가로 모드
[[NCSDKManager getSharedInstance] setOrientationIsLandscape:YES];

다음은 플러그를 세로 모드로 실행하는 예다.

//세로 모드
[[NCSDKManager getSharedInstance] setOrientationIsLandscape:NO];

투명도 조절

플러그 화면 왼쪽 위의 투명도 조절 슬라이더로 투명도를 조절하면 게임과 카페를 동시에 사용할 수 있다.

투명도

설명

알파값 100%

플러그로 터치 이벤트 전달

알파값 100% 이하

게임으로 터치 이벤트 전달

Android

Android 환경에서 투명도 조절 슬라이더 사용 여부는 setTransparentable() 메서드로 설정한다.

public static void setTransparentable(Activity activity, boolean isTransparentable)

isTransparentable 파라미터의 값을 true로 설정하면 투명도 조절 슬라이더를 사용할 수 있다(기본값: true).

다음은 투명도 조절 슬라이더를 사용하도록 구현한 예다.

  /**
   * 투명도 조절 슬라이더 사용 여부를 설정한다.
   *
   * @param isTransparentable 투명도 조절을 사용할 수 있는지에 대한 boolean 형식의 값
   */
  Glink.setTransparentable(activity, true)

iOS

iOS 환경에서 투명도 조절 슬라이더 사용 여부는 disableTransparentSlider: 메서드로 설정한다.

(void)disableTransparentSlider:(BOOL)disable;

disable 파라미터의 값을 YES로 설정하면 투명도 조절 슬라이더를 사용할 수 있다(기본값: YES).

다음은 투명도 조절 슬라이더를 사용하도록 구현한 예다.

/*
 투명도 조절 기능 제거
 default : YES
 */
//투명도 기능 사용
[[NCSDKManager getSharedInstance] disableTransparentSlider:YES];

다음은 투명도 조절 슬라이더를 사용하지 않도록 구현한 예다.

//투명도 기능 제거
[[NCSDKManager getSharedInstance] disableTransparentSlider:NO];

위젯

위젯은 플러그의 접기 버튼을 누르면 자동으로 화면에 나타나는 요소다. 위젯으로 게임 내 어디서든 플러그를 이용할 수 있다.

위젯 표시

플러그의 접기 버튼을 눌렀을 때 위젯을 표시할지는 ShowWidgetWhenUnloadSdk() 메서드로 설정한다.

static void ShowWidgetWhenUnloadSdk(bool show)

show 파라미터의 값을 true로 설정하면 플러그 창이 접힐 때 위젯이 나타난다(기본값: true).

다음은 위젯이 표시되도록 구현한 예다.

  /**
   * 플러그 창이 접힐 때 위젯을 표시할지 결정한다.
   *
   * @param show 위젯을 표시할지에 대한 boolean 형식의 값
   */
    UFUNCTION(BlueprintCallable, Category = "Naver CafeSdk")
    static void ShowWidgetWhenUnloadSdk(bool bUse)

위젯 기본 위치 설정

위젯이 처음 실행될 때는 화면 왼쪽의 중앙에 나타난다. 위젯이 처음 실행될 때 나타날 기본 위치를 설정하려면 SetWidgetStartPosition() 메서드를 사용한다.

단, 사용자가 위젯을 옮긴 다음 위젯이 다시 실행될 때는 사용자가 이동한 마지막 위치에 위젯이 나타난다.

위젯의 기본 위치 설정은 플러그 2.3.0부터 지원한다.

static void SetWidgetStartPosition(bool bIsLeft, int32 HeightPercentage);

다음은 위젯 기본 위치를 화면 오른쪽, 위에서 20% 위치로 설정하는 예다.

  /**
   * bIsLeft: true면 왼쪽에, false면 오른쪽에 나타난다.
   * HeightPercentage: 세로의 위치를 %로 지정할 수 있다.

   */
  UCafeSdkBlueprintLibrary::SetWidgetStartPosition(false, 20);

화면 캡처

위젯의 화면 캡처 버튼을 누르면 게임 화면을 캡처할 수 있다.

화면 캡처 버튼

화면 캡처 버튼을 눌렀을 때 화면을 캡처하는 기능은 위젯 화면 캡처 버튼 클릭 리스너인 OnScreenshotCaptured를 등록해 구현한다.

static FOnScreenshotCaptured& OnScreenshotCaptured()

다음은 위젯 화면 캡처 버튼 클릭 리스너를 구현한 예다.

  /**
   * 화면 캡처 버튼 클릭 콜백 함수를 등록한다.
   */
void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
...        
        GEngine->GameViewport->OnScreenshotCaptured().AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnScreenshotCaptured);
...            
    }
}


  /**
   * 위젯 화면 캡처 버튼 클릭 리스너를 설정한다.
   */
void ACafeSDKSampleProjectGameMode::OnScreenshotCaptured(int32 Width, int32 Height, const TArray<FColor>& Colors)
{
    auto Bitmap = TArray<FColor>(Colors);
    GetHighResScreenshotConfig().MergeMaskIntoAlpha(Bitmap);

    FIntRect SourceRect(0, 0, GScreenshotResolutionX, GScreenshotResolutionY);
    if (GIsHighResScreenshot)
    {
        SourceRect = GetHighResScreenshotConfig().CaptureRegion;
    }

    FString ScreenshotName = FScreenshotRequest::GetFilename();

    if (!FPaths::GetExtension(ScreenshotName).IsEmpty())
    {
        ScreenshotName = FPaths::GetBaseFilename(ScreenshotName, false);
        ScreenshotName += TEXT(".png");
    }

    // Save the contents of the array to a png file.
    TArray<uint8> CompressedBitmap;
    FImageUtils::CompressImageArray(Width, Height, Bitmap, CompressedBitmap);
    FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenshotName);

#if PLATFORM_ANDROID
    extern FString GFilePathBase;
    FString BasePath = GFilePathBase + TEXT("/UE4Game/") + FApp::GetGameName() + TEXT("/") + FApp::GetGameName() + TEXT("/Saved/Screenshots/");
    FString ScreenshotPath = FPaths::ConvertRelativePathToFull(BasePath, ScreenshotName);
    UCafeSdkBlueprintLibrary::StartImageWrite(TEXT("file://") + ScreenshotPath);
#elif PLATFORM_IOS
    FString Result = ScreenshotName;
    Result.ReplaceInline(TEXT("../"), TEXT(""));
    Result.ReplaceInline(TEXT(".."), TEXT(""));
    Result.ReplaceInline(FPlatformProcess::BaseDir(), TEXT(""));

    FString WritePathBase = FString([NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]) + TEXT("/");
    UCafeSdkBlueprintLibrary::StartImageWrite(WritePathBase + Result);
#endif
}

화면 캡처 사용 설정

SetUseScreenshot() 메서드로 화면 캡처 기능 사용 여부를 설정한다.

static void SetUseScreenshot(boolean use);

use 파라미터의 값을 true로 설정하면 위젯에 화면 캡처 버튼이 표시된다(기본값: true).

다음은 화면 캡처 기능을 사용하도록 구현한 예다.

/**
* 화면 캡처 기능을 사용한다.
*/
UCafeSdkBlueprintLibrary::SetUseScreenshot(true);

동영상 녹화

위젯에서 동영상 녹화 버튼을 누르면 게임 화면을 녹화할 수 있다.

동영상 녹화가 완료됐을 때 처리할 작업은 녹화 완료 리스너인 OnCafeSdkRecordFinish를 등록해 구현한다.

static FOnCafeSdkRecordFinish OnCafeSdkRecordFinish;

다음은 녹화 완료 리스너를 구현한 예다.

  /**
   * 녹화 완료 콜백을 등록한다.
   */
void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
...        
        FCafeSDKPluginModule::OnCafeSdkRecordFinish.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkRecordFinish);
...            
    }
}

  /**
   * 녹화 완료 리스너를 설정한다.
   */
void ACafeSDKSampleProjectGameMode::OnCafeSdkRecordFinish(const FString& FileUri)
{
    UCafeSdkBlueprintLibrary::StartVideoWrite(FileUri);
}

동영상 녹화

위젯의 동영상 녹화 버튼을 누르면 게임 중에 게임 화면을 녹화할 수 있다.

  • 동영상 녹화 기능은 Android 5.0 이상 기기부터 지원한다.

  • 동영상 녹화 기능은 iOS 9.0 이상 기기부터 지원한다.

동영상 녹화 사용 설정

SetUseVideoRecord() 메서드로 동영상 녹화 기능 사용 여부를 설정한다.

static void SetUseVideoRecord(bool use)

use 파라미터의 값을 true로 설정하면 위젯에 동영상 녹화 버튼이 표시된다(기본값: false).

Android 5.0 미만 기기와 iOS 9.0 미만 기기에서는 use 파라미터의 값을 true로 설정해도 위젯에 동영상 녹화 버튼이 표시되지 않는다.

다음은 동영상 녹화 기능을 사용하도록 구현한 예다.

/**
   * 동영상 녹화 기능을 사용 할지 결정한다.
   *
   * @param use 동영상 녹화 기능을 사용할지에 대한 boolean 형식의 값
   */
...
    UCafeSdkBlueprintLibrary::SetUseVideoRecord(true);
...

녹화 완료 콜백 리스너

동영상 녹화가 완료됐을 때 처리할 작업은 OnCafeSdkRecordFinish 리스너를 등록해 구현한다.

static FOnCafeSdkRecordFinish OnCafeSdkRecordFinish;

다음은 녹화 완료 리스너를 구현한 예다.

/**
   * 녹화 완료 콜백을 등록한다.
   */
void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
...        
        FCafeSDKPluginModule::OnCafeSdkRecordFinish.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkRecordFinish);
...            
    }
}

  /**
   * 녹화 완료 리스너를 설정한다.
   */
void ACafeSDKSampleProjectGameMode::OnCafeSdkRecordFinish(const FString& FileUri)
{
    UCafeSdkBlueprintLibrary::StartVideoWrite(5, TEXT("subject"), TEXT("text"), FileUri);
}

App Scheme 처리

게임에서 플러그의 홈 화면에 나오는 배너 이미지를 누르면 App Scheme으로 이동해 게임 기능을 실행하게 할 수 있다.

App Scheme으로 이동할 배너 이미지는 카페 관리 메뉴에서 등록한다.

Android

Android 환경에서 App Scheme으로 이동하는 배너 이미지가 있을 때 다음과 같이 OnCafeSdkClickAppSchemeBanner를 설정하면 터치 이벤트가 일어났을 때 App Scheme을 처리하는 기능을 구현할 수 있다.

static FOnCafeSdkClickAppSchemeBanner OnCafeSdkClickAppSchemeBanner;

다음은 App Scheme을 처리하도록 리스너를 구현한 예다.

void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
...
        FCafeSDKPluginModule::OnCafeSdkClickAppSchemeBanner.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkClickAppSchemeBanner);
...        
    }
}

// 앱 스킴 터치 리스너 설정.
void ACafeSDKSampleProjectGameMode::OnCafeSdkClickAppSchemeBanner(const FString& AppScheme)
{
    FString Message = FString::Printf(TEXT("OnCafeSdkClickAppSchemeBanner: %s"), *AppScheme);
    ShowMessage(Message);
}

iOS

iOS 환경에서 App Scheme으로 이동하는 배너 이미지를 누르면 openURL: 메서드를 실행해 App Scheme을 처리하도록 다음 예와 같이 앱 델리게이트를 설정한다.

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
...
//관리 메뉴에서 등록된 App Scheme을 AppDelegate에서 처리한다.
//ex : gLinkSample://test
    if ([[url scheme] isEqualToString:@"gLinkSample"]) {
        if ([[url host] isEqualToString:@"test"]) {
            //todo
        }
    }
...
}

콜백 리스너

콜백 리스너를 등록해 플러그에서 발생하는 이벤트를 처리한다.

Unreal용 네이버 카페 플러그 라이브러리에는 다음과 같이 콜백 리스너가 등록돼 있다.

void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
    AGameMode::InitGame(MapName, Options, ErrorMessage);

    if (FCafeSDKPluginModule::IsAvailable())
    {
        UCafeSdkBlueprintLibrary::Init("U5ZHoj_OStOHOJ8mec_s", "piPHPA9i4E", 28334359);

        //플러그 시작
        FCafeSDKPluginModule::OnCafeSdkStarted.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkStarted);

        //플러그 종료
        FCafeSDKPluginModule::OnCafeSdkStopped.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkStopped);

        //앱스킴
        FCafeSDKPluginModule::OnCafeSdkClickAppSchemeBanner.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkClickAppSchemeBanner);

        //카페 가입
        FCafeSDKPluginModule::OnCafeSdkJoined.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkJoined);

        //게시글 등록
        FCafeSDKPluginModule::OnCafeSdkPostedArticle.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkPostedArticle);

        //댓글 등록
        FCafeSDKPluginModule::OnCafeSdkPostedComment.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkPostedComment);

        //게시글 내 투표
        FCafeSDKPluginModule::OnCafeSdkDidVote.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkDidVote);

        //위젯 동영상 녹화 완료
        FCafeSDKPluginModule::OnCafeSdkRecordFinish.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkRecordFinish);

        //스크린숏
        GEngine->GameViewport->OnScreenshotCaptured().AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnScreenshotCaptured);
    }
}

플러그 시작 리스너

OnCafeSdkStarted는 플러그가 시작될 때 발생하는 이벤트를 처리하는 콜백 리스너다.

static FOnCafeSdkStarted OnCafeSdkStarted;

다음은 플러그 시작 리스너를 구현한 예다.

   // 플러그 시작 리스너 설정
void ACafeSDKSampleProjectGameMode::OnCafeSdkStarted()
{
    ShowMessage("OnCafeSdkStarted");
}

플러그 종료 리스너

OnCafeSdkStopped는 플러그가 종료될 때 발생하는 이벤트를 처리하는 콜백 리스너다.

static FOnCafeSdkStopped OnCafeSdkStopped;

다음은 플러그 종료 리스너를 구현한 예다.

// 플러그 종료 리스너 설정
void ACafeSDKSampleProjectGameMode::OnCafeSdkStopped()
{
    ShowMessage("OnCafeSdkStopped");
}

App Scheme 리스너

OnCafeSdkClickAppSchemeBanner는 Android 환경에서 게임 사용자가 App Scheme으로 이동하는 배너 이미지를 눌렀을 때 발생하는 이벤트를 처리하는 콜백 리스너다.

static FOnCafeSdkClickAppSchemeBanner OnCafeSdkClickAppSchemeBanner;

다음은 App Scheme 리스너를 구현한 예다.

// App Scheme 리스너 설정
void ACafeSDKSampleProjectGameMode::OnCafeSdkClickAppSchemeBanner(const FString& AppScheme)
{
    FString Message = FString::Printf(TEXT("OnCafeSdkClickAppSchemeBanner: %s"), *AppScheme);
    ShowMessage(Message);
}

카페 가입 리스너

OnCafeSdkJoined는 게임 사용자가 플러그에서 카페에 가입했을 때 발생하는 이벤트를 처리하는 콜백 리스너다.

static FOnCafeSdkJoined OnCafeSdkJoined;

다음은 카페 가입 리스너를 구현한 예다.

// 카페 가입 리스너 설정
void ACafeSDKSampleProjectGameMode::OnCafeSdkJoined()
{
    ShowMessage("OnCafeSdkJoined");
}

게시글 등록 리스너

OnCafeSdkPostedArticle는 사용자가 플러그에서 게시글을 등록했을 때 발생하는 이벤트를 처리하는 콜백 리스너다.

static FOnCafeSdkPostedArticle OnCafeSdkPostedArticle;

다음은 게시글 등록 리스너를 구현한 예다.

   /** 게시글 등록 리스너 설정
     * @param menuId 게시글이 등록된 menuId
     * @param imageCount 첨부한 이미지 파일의 개수
     * @param videoCount 첨부한 동영상 파일의 개수
     **/
void ACafeSDKSampleProjectGameMode::OnCafeSdkPostedArticle(int32 MenuId, int32 ImageCount, int32 VideoCount)
{
    FString Message = FString::Printf(TEXT("OnCafeSdkPostedArticle: %d, %d, %d"), MenuId, ImageCount, VideoCount);
    ShowMessage(Message);
}

댓글 등록 리스너

OnCafeSdkPostedComment는 사용자가 플러그에서 게시글에 댓글을 등록했을 때 발생하는 이벤트를 처리하는 콜백 리스너다.

댓글 등록 리스너는 플러그 1.7.0 이상부터 지원한다.

static FOnCafeSdkPostedComment OnCafeSdkPostedComment;

다음은 댓글 등록 리스너를 구현한 예다.

   // 댓글 등록 리스너 설정
void ACafeSDKSampleProjectGameMode::OnCafeSdkPostedComment(int32 ArticleId)
{
    FString Message = FString::Printf(TEXT("OnCafeSdkPostedComment: %d"), ArticleId);
    ShowMessage(Message);
}

투표 완료 리스너

OnCafeSdkDidVote는 사용자가 플러그에서 투표가 있는 게시글의 투표를 완료했을 때 발생하는 이벤트를 처리하는 콜백 메서드다.

static FOnCafeSdkDidVote OnCafeSdkDidVote;

다음은 투표 완료 리스너를 구현한 예다.

   // 투표 완료 리스너 설정
void ACafeSDKSampleProjectGameMode::OnCafeSdkDidVote(int32 ArticleId)
{
    FString Message = FString::Printf(TEXT("OnCafeSdkDidVote: %d"), ArticleId);
    ShowMessage(Message);
}

화면 캡처 버튼 클릭 리스너

OnScreenshotCaptured는 사용자가 위젯에서 화면 캡처 버튼을 눌렀을 때 발생하는 이벤트를 처리하는 콜백 리스너다. 화면 캡처 버튼에 관해서는 "위젯"을 참고한다.

static FOnScreenshotCaptured& OnScreenshotCaptured()

다음은 화면 캡처 버튼 클릭 리스너를 구현한 예다. 화면을 캡처하는 기능을 콜백 리스너에 구현해야 화면 캡처 버튼을 눌렀을 때 화면을 캡처할 수 있다.

  /**
   * 위젯 화면 캡처 버튼 클릭 리스너를 설정한다.
   */
void ACafeSDKSampleProjectGameMode::OnScreenshotCaptured(int32 Width, int32 Height, const TArray<FColor>& Colors)
{
    auto Bitmap = TArray<FColor>(Colors);
    GetHighResScreenshotConfig().MergeMaskIntoAlpha(Bitmap);

    FIntRect SourceRect(0, 0, GScreenshotResolutionX, GScreenshotResolutionY);
    if (GIsHighResScreenshot)
    {
        SourceRect = GetHighResScreenshotConfig().CaptureRegion;
    }

    FString ScreenshotName = FScreenshotRequest::GetFilename();

    if (!FPaths::GetExtension(ScreenshotName).IsEmpty())
    {
        ScreenshotName = FPaths::GetBaseFilename(ScreenshotName, false);
        ScreenshotName += TEXT(".png");
    }

    // Save the contents of the array to a png file.
    TArray<uint8> CompressedBitmap;
    FImageUtils::CompressImageArray(Width, Height, Bitmap, CompressedBitmap);
    FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenshotName);

#if PLATFORM_ANDROID
    extern FString GFilePathBase;
    FString BasePath = GFilePathBase + TEXT("/UE4Game/") + FApp::GetGameName() + TEXT("/") + FApp::GetGameName() + TEXT("/Saved/Screenshots/");
    FString ScreenshotPath = FPaths::ConvertRelativePathToFull(BasePath, ScreenshotName);
    UCafeSdkBlueprintLibrary::StartImageWrite(-1, "", "", TEXT("file://") + ScreenshotPath);
#elif PLATFORM_IOS
    FString Result = ScreenshotName;
    Result.ReplaceInline(TEXT("../"), TEXT(""));
    Result.ReplaceInline(TEXT(".."), TEXT(""));
    Result.ReplaceInline(FPlatformProcess::BaseDir(), TEXT(""));

    FString WritePathBase = FString([NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]) + TEXT("/");
    UCafeSdkBlueprintLibrary::StartImageWrite(-1, "", "", WritePathBase + Result);
#endif
}

녹화 완료 리스너

OnCafeSdkRecordFinish는 플러그에서 동영상 녹화가 완료되면 발생하는 이벤트를 처리하는 콜백 리스너다.

static FOnCafeSdkRecordFinish OnCafeSdkRecordFinish;

다음은 녹화 완료 리스너를 구현한 예다.

  /** 녹화 완료 리스너 설정
   * 동영상 녹화 기능을 사용할지 결정한다.
   *
   * @param uri 동영상이 녹화된 파일 경로에 대한 URI
   */
void ACafeSDKSampleProjectGameMode::OnCafeSdkRecordFinish(const FString& FileUri)
{
    UCafeSdkBlueprintLibrary::StartVideoWrite(5, TEXT("subject"), TEXT("text"), FileUri);
}

게임 아이디 연동

사용자의 게임 아이디와 카페 아이디를 연동해 관리할 수 있다. 연동된 게임 아이디와 카페 아이디 목록은 카페 관리 메뉴에서 확인할 수 있다.

게임 아이디를 카페 아이디와 연동하려면 SyncGameUserId() 메서드를 사용한다.

static void SyncGameUserId(FString GameUserId)

다음은 게임 아이디와 카페 아이디를 연동하는 예다.

  /**
   * 게임 아이디와 카페 아이디를 연동한다.
   *
   * @param gameUserId 게임 아이디
   */
void ACafeSDKSampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
...    
   UCafeSdkBlueprintLibrary::SyncGameUserId("userGameID");
...
}

테마 색상 변경

플러그의 테마 색상을 변경할 수 있다.

테마 색상을 변경하려면 SetThemeColor() 메서드를 사용한다.

/** 
* ThemeColorCSSString 파라미터의 기본값은 '#00c73c'다.
* TabBackgroundColorCSSString 파라미터의 기본값은 '#44484e'다.
* TabBackgroundColorCSSString 파라미터는 기본값을 사용하기를 권장한다.
**/

void UCafeSdkBlueprintLibrary::SetThemeColor(FString ThemeColorCSSString, FString TabBackgroundColorCSSString)
  • ThemeColorCSSString: 테마에서 기본으로 사용할 색상(기본값: #00c73c)

  • TabBackgroundColorCSSString: 탭 메뉴의 배경 색상(기본값: #44484e). 기본값을 사용하기를 권장한다.

주의 CSS 색상값에 알파값을 넣으면 안 된다.

  • 올바른 예: #ff9800

  • 잘못된 예: #e2ff9800

다음은 테마 색상을 변경하는 예다.

UCafeSdkBlueprintLibrary::SetThemeColor("#00c73c", "#44484e");

네이버 로그인

애플리케이션에서 네이버 아이디로 로그인 기능을 사용한다.

  • 네이버 로그인 기능은 NaverIdLoginBlueprintLibrary.h 파일을 사용한다.

Init() 메서드

다음 초기화 정보로 네이버 로그인 기능을 초기화한다.

다음은 네이버 로그인 기능을 초기화한 예다.

    UNaverIdLoginBlueprintLibrary::Init("197CymaStozo7x5r2qR5", "evCgKH1kJL");

Login() 메서드

네이버 아이디로 로그인한다.

    UNaverIdLoginBlueprintLibrary::Login();

로그인 완료 후 발생하는 이벤트는 다음과 같이 델리게이트로 처리한다.

    FCafeSDKPluginModule::OnLoggedIn.AddUObject(this,
            &ACafeSDKSampleProjectGameMode::OnCafeSdkLoggedIn);

    void ACafeSDKSampleProjectGameMode::OnCafeSdkLoggedIn(bool bSuccess) {
        // handle event.
    }

Logout() 메서드

로그아웃한다.

    UNaverIdLoginBlueprintLibrary::Logout();

IsLogin() 메서드

로그인한 상태인지 확인한다.

    UNaverIdLoginBlueprintLibrary::IsLogin();

GetProfile() 메서드

로그인한 사용자의 기본 정보(메일 주소, 별명, 프로필 사진, 생일, 연령대)를 조회한다.

    UNaverIdLoginBlueprintLibrary::GetProfile();

조회할 정보는 델리게이트를 등록해 설정한다.

    FCafeSDKPluginModule::OnGetProfile.AddUObject(this,
        &ACafeSDKSampleProjectGameMode::OnCafeSdkGetProfile);

    void ACafeSDKSampleProjectGameMode::OnCafeSdkGetProfile(const FString& JsonString) {
        // handle event.
    }

Last updated