Unreal Engine을 이용하여 개발할 때 Hive SDK를 포팅하는 방법과 Android 혹은 iOS 앱으로 빌드하는 방법을 안내합니다.
개발 환경
본 가이드는 다음의 환경을 기준으로 안내합니다.
공통 개발 환경
- Hive SDK v4 UE5 Android+iOS 24.1.0
- Unreal Engine 5.3.2
Android 개발 환경
- JAVA 8
- AndroidStudio 4.1
- Android NDK r25
- Android SDK min version 26
- Android SDK target version 34
iOS 개발 환경
- Xcode 15.1+
- iOS Version 15+
- macOS Ventura 14+
Windows 개발 환경
- Windows 10+
포팅하기
Unreal Engine을 이용한다면 Hive SDK를 플러그인의 형태로 Unreal Engine에 포팅해 주세요. 다음의 안내대로 Hive SDK를 개발 환경에 추가하고 필요한 설정 작업과 코드 작업을 수행하세요:
- Unreal Engine 빌드하기
- Unreal Editor에 Hive SDK를 플러그인 형태로 추가하기
- Unreal Engine 파일 수정하기
- 일반 설정하기
- Hive 설정하기
- Hive 기능 선택 적용하기
Unreal Engine 빌드하기
개발 환경을 참고해 Unreal Engine 소스코드를 받아 빌드합니다.
macOS 환경을 위한 Rosetta 에뮬레이터 활성화
Apple Silicon CPU가 탑재된 macOS 개발 환경에서는 Rosetta 에뮬레이터를 사용해야 합니다. Xcode에서 Product > Destination > Destination Architectures > Show Rosetta Destinations를 체크하세요.
Unreal Editor에 Hive SDK 추가하기
Hive SDK를 Unreal Editor에 플러그인 형태로 추가하세요. 아직 Unreal Engine용 Hive SDK가 없다면, SDK 다운로드 페이지에서 Unreal Engine용 Hive SDK를 다운로드 받으세요.
이미 Unreal Engine용 Hive SDK를 다운로드 받았다면 다음의 안내를 따라 Hive SDK를 Unreal Editor에 플러그인 형태로 추가하세요.
- 개발자 사이트에서 다운로드 받은 Unreal Engine 용 Hive SDK의 압축을 풀고, 압축 해제된 파일 중 Plugin 폴더 내 모든 항목을 Unreal 게임 프로젝트의 루트 디렉토리 아래 Plugins 디렉토리로 복사하세요.
- 다음의 코드와 같이
"HIVESDK"
를 <프로젝트_루트>/Source/<프로젝트_루트>/<프로젝트_이름>build.cs 파일 내에서 호출하는PublicDependencyModuleNames.AddRange()
함수의 파라미터에 추가하세요. <프로젝트_이름>은 실제 여러분의 프로젝트 이름으로 대체하세요.
1234567public class <프로젝트_이름> : ModuleRules{public <프로젝트_이름>(ReadOnlyTargetRules Target) : base(Target){PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "UMG", "HIVESDK", "JSon", "Http", "ImageWrapper", "ApplicationCore"});}}
Unreal Engine 파일 수정하기
다음 안내에 따라 Unreal Engine 파일을 제거 및 수정하세요.
Android
게임 빌드에서 화면 방향을 양방향(가로와 세로 방향 모두)으로 설정 시, 화면 자동 회전 기능이 정상 동작하려면 아래 코드 수정이 필요합니다.
-
/Engine/Build/Android/Java/src/com/epicgames/unreal/GameActivity.java.template로
이동하세요. -
HiveActivity.onConfigurationChaged()
API를 추가하세요.12345678910111213@Overridepublic void onConfigurationChanged(Configuration newConfig){HiveActivity.onConfigurationChanged(this, newConfig); // Addsuper.onConfigurationChanged(newConfig);// forward the orientationboolean bPortrait = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;nativeOnConfigurationChanged(bPortrait);}
Hive SDK에서 사용하는 Google Billing Library 5 버전과 언리얼 엔진에 내포된 Google Billing 기능 사이에 호환성 문제가 존재하여 빌드가 실패합니다. 정상 빌드를 위해 아래 코드를 수정하세요.
-
/Engine/Plugins/Online/Android/OnlineSubsystemGooglePlay/Source/OnlineSubsystemGooglePlay.Build.cs
로 이동하세요. -
다음 코드를 주석처리 합니다.
1234//string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);//AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(PluginPath, "OnlineSubsystemGooglePlay_UPL.xml"));
Hive SDK에 포함된 Singular 외부 라이브러리를 정상적으로 사용하려면 아래 코드 수정이 필요합니다.
-
/Engine/Build/Android/Java/src/com/android/vending/licensing 로 이동하세요.
-
다음 파일을 삭제합니다.
- ILicensingService.aidl
- ILicenseResultListener.aidl
iOS
Hive SDK에서 제공하는 Notification 기능을 사용하기 위해 Unreal Engine 수정이 필요합니다.
아래 파일들에서 'Add'
주석으로 표시한 라인을 추가하세요.
Engine/Source/Runtime/ApplicationCore/Public/IOS/IOSAppDelegate.h
1 2 3 4 5 6 7 8 9 10 |
DECLARE_MULTICAST_DELEGATE_FourParams(FOnOpenURL, UIApplication*, NSURL*, NSString*, id); static FOnOpenURL OnOpenURL; // Add - Start DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnOpenURLwithOptions, UIApplication*, NSURL*, NSDictionary* ); static FOnOpenURLwithOptions OnOpenURLwithOptions; // Add - End |
1 2 3 4 5 |
// parameters passed from openURL @property (nonatomic, retain) NSMutableArray* savedOpenUrlParameters; @property (nonatomic, retain) NSMutableArray* savedOpenUrlWithOptionsParameters; /// Add |
Engine/Source/Runtime/ApplicationCore/Private/IOS/IOSAppDelegate.cpp
1 2 3 4 5 6 7 8 9 |
extern bool GShowSplashScreen; FIOSCoreDelegates::FOnOpenURL FIOSCoreDelegates::OnOpenURL; FIOSCoreDelegates::FOnOpenURLwithOptions FIOSCoreDelegates::OnOpenURLwithOptions; /// Add FIOSCoreDelegates::FOnWillResignActive FIOSCoreDelegates::OnWillResignActive; FIOSCoreDelegates::FOnDidBecomeActive FIOSCoreDelegates::OnDidBecomeActive; TArray<FIOSCoreDelegates::FFilterDelegateAndHandle> FIOSCoreDelegates::PushNotificationFilters; |
1 2 3 4 5 6 7 |
@synthesize AccessibilityCacheTimer; #endif @synthesize savedOpenUrlParameters; @synthesize savedOpenUrlWithOptionsParameters; // Add @synthesize BackgroundSessionEventCompleteDelegate; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
GShowSplashScreen = false; }, TStatId(), NULL, ENamedThreads::ActualRenderingThread); } // Add - Start for (NSDictionary* openUrlParameter in self.savedOpenUrlWithOptionsParameters) { UIApplication* application = [openUrlParameter valueForKey : @"application"]; NSURL* url = [openUrlParameter valueForKey : @"url"]; NSDictionary<NSString*, id> * options = [openUrlParameter valueForKey : @"options"]; FIOSCoreDelegates::OnOpenURLwithOptions.Broadcast(application, url, options); } self.savedOpenUrlWithOptionsParameters = nil; // clear after saved openurl delegate running // Add - End for (NSDictionary* openUrlParameter in self.savedOpenUrlParameters) { UIApplication* application = [openUrlParameter valueForKey : @"application"]; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { // save launch options self.launchOptions = launchOptions; #if PLATFORM_TVOS self.bDeviceInPortraitMode = false; #else // use the status bar orientation to properly determine landscape vs portrait self.bDeviceInPortraitMode = UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]); printf("========= This app is in %s mode\n", self.bDeviceInPortraitMode ? "PORTRAIT" : "LANDSCAPE"); #endif // check OS version to make sure we have the API OSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (!FPlatformMisc::IsDebuggerPresent() || GAlwaysReportCrash) { // InstallSignalHandlers(); } self.savedOpenUrlParameters = [[NSMutableArray alloc] init]; self.savedOpenUrlWithOptionsParameters = [[NSMutableArray alloc] init]; /// Add self.PeakMemoryTimer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(RecordPeakMemory) userInfo:nil repeats:YES]; #if !BUILD_EMBEDDED_APP |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
return YES; } // Add - Start //### use option - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { #if !NO_LOGGING NSLog(@"%s", "IOSAppDelegate openURL options\n"); #endif NSString* EncdodedURLString = [url absoluteString]; NSString* URLString = [EncdodedURLString stringByRemovingPercentEncoding]; FString CommandLineParameters(URLString); // Strip the "URL" part of the URL before treating this like args. It comes in looking like so: // "MyGame://arg1 arg2 arg3 ..." // So, we're going to make it look like: // "arg1 arg2 arg3 ..." int32 URLTerminator = CommandLineParameters.Find( TEXT("://"), ESearchCase::CaseSensitive); if ( URLTerminator > -1 ) { CommandLineParameters.RightChopInline(URLTerminator + 3, false); } FIOSCommandLineHelper::InitCommandArgs(CommandLineParameters); self.bCommandLineReady = true; [self.CommandLineParseTimer invalidate]; self.CommandLineParseTimer = nil; // Save openurl infomation before engine initialize. // When engine is done ready, running like previous. ( if OnOpenUrl is bound on game source. ) if (bEngineInit) { FIOSCoreDelegates::OnOpenURLwithOptions.Broadcast(app, url, options); } else { #if !NO_LOGGING NSLog(@"%s", "Before Engine Init receive IOSAppDelegate openURL\n"); #endif NSDictionary* openUrlParameter = [NSDictionary dictionaryWithObjectsAndKeys : app , @"application", url, @"url", options, @"options", nil]; [savedOpenUrlWithOptionsParameters addObject : openUrlParameter]; } return YES; } // Add - End FCriticalSection RenderSuspend; - (void)applicationWillResignActive:(UIApplication *)application { |
Universal Link 설정하기
- Hive SDK v4.15.8 이상 버전부터 URL Scheme 방식이 아닌 Universal Link를 사용하여 초대 페이지를 통한 앱 최초 설치 및 실행, 초대자 보상이 이루어 집니다.
- Universal Link 기반의 초대자 링크 생성을 위한 추가 콘솔 설정은 개발자 사이트의 프로모션 운영가이드를 참고 하세요.
아래 파일들에서 'Add'
주석으로 표시한 라인을 추가하세요.
Engine/Source/Programs/UnrealBuildTool/Platform/IOS/IOSExport.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Text.AppendLine( "<dict>"); Text.AppendLine( "\t<key>get-task-allow</key>"); Text.AppendLine(string.Format( "\t<{0}/>", bForDistribution ? "false": "true")); // Add Text.AppendLine( "\t<key>com.apple.developer.associated-domains</key>"); Text.AppendLine( "\t<array>"); Text.AppendLine( "\t\t<string>Universal Link 기반의 초대자 링크 추가 (ex.applinks:hiveota.withhive.com)</string>"); /* 아래 내용은 Hive SDK 샘플앱에 사용된 예시입니다. Text.AppendLine("\t\t<string>applinks:hiveota.withhive.com</string>"); Text.AppendLine("\t\t<string>applinks:dev-promotion.qpyou.cn</string>"); Text.AppendLine("\t\t<string>applinks:promotion.qpyou.cn</string>"); Text.AppendLine("\t\t<string>applinks:sandbox-promotion.qpyou.cn</string>"); Text.AppendLine("\t\t<string>applinks:test-promotion.qpyou.cn</string>"); */ Text.AppendLine( "\t</array>"); // Add End if (bCloudKitSupported) { if (iCloudContainerIdentifiersXML != "") |
일반 설정하기
Android
- Unreal Editor에서 편집 > 프로젝트 세팅 메뉴를 클릭하세요. 프로젝트 설정 창이 화면에 나타납니다.
- 프로젝트 설정 창의 좌측 패널에서 플랫폼 제목 아래의 안드로이드 SDK 메뉴를 클릭하세요. 안드로이드 SDK 설정 화면이 나타나면, 다음의 안내대로 Android 버전을 설정하세요.
- SDK API Level 필드를 android-30(Hive SDK v4.15.1+)이상으로 설정하세요.
- NDK API Level 필드를 android-21로 설정하세요.
- 프로젝트 설정 창의 좌측 패널에서 플랫폼 제목 아래의 안드로이드 메뉴를 클릭하세요. 안드로이드 화면이 나타나면 APKPackaging 섹션에서 다음의 필드를 안내된 대로 설정하세요.
- Android Package Name 필드에 게임의 AppID를 입력하세요.
- Store Version 필드에 Google Play Store에 명시하는 앱의 버전을 입력하세요. 앱 버전에 대해 자세히 보기
- Minimum SDK Version 필드를 21 이상으로 설정하세요. 21 미만으로 지정된 값은 Unreal Engine 동작에 따라 자동으로 21로 설정됩니다.
- Target SDK Version 필드를 30(Hive SDK v4.15.1+) 이상으로 설정하세요.
Google과 Google Play Games 인증 지원
Hive SDK는 일반 구글 인증(iOS, Android)과 Google Play Games 인증(Android)을 모두 지원합니다. Google Play Games 인증을 사용하려면 먼저 아래와 같이 언리얼 엔진 코드를 수정해야 합니다.
- ./Engine/Build/Android/Java/src/com/epicgames/unreal/GameActivity.java.template와 ./Engine/Build/Android/Java/src/com/epicgames/unreal/psoservices/PSOProgramServiceAccessor.java를 엽니다.
- 아래 라인을 제거합니다.
1import com.google.android.gms.games.Games
Google 또는 Google Play Games 인증을 사용하려면 “GOOGLE” 또는 “GOOGLE_PLAY_GAMES” ProviderType
를 선택해 AuthV4.SignIn()을 호출합니다.
iOS
- Unreal Editor의 메뉴에서 편집 > 프로젝트 세팅 메뉴를 클릭하세요. 프로젝트 설정 창이 화면에 나타납니다.
- 프로젝트 설정 창의 좌측 패널에서 플랫폼 제목 아래의 iOS 메뉴를 선택하세요. iOS 설정 화면이 나타나면, 그룹 별로 안내된 항목을 설정하세요.
- Bundle Information 그룹: 번들 식별자(Bundle Identifier) 필드에 게임의 AppID를 입력하세요.
- OS Info 그룹: Unreal Engine 4.25부터 지원하는 OS 버전이 11.0 이상으로 변경되었습니다. Minimum OSVersion 필드 값을 11.0으로 설정하세요.
- Build 그룹: Additional Non-Shipping Linker Flags 필드와 Additional Shipping Linker Flags 필드에 -ObjC를 입력하세요.
- Extra PList Data 그룹: Additional PList Data 필드에 다음의 코드를 입력하세요.
- 접근 권한 요청 설정하기
- Facebook, QQ, VK, WeChat, Line을 이용할 경우, 서버 Whitelist를 설정하기 위해 다음 코드를 추가하세요.
- Facebook 이용 시 다음의 코드를 이용하여 Facebook AppID와 ClientToken을 추가하세요.
반드시 여러분 게임에 대한 Facebook AppID와 ClientToken 값을 입력하세요. - URL Scheme을 설정하세요.
- 다음은 위 안내의 모든 값을 Additional PList Data 필드에 넣은 값의 예제입니다.
123456<key>NSCameraUsageDescription</key><string>Approval required to take pictures.</string><key>NSPhotoLibraryUsageDescription</key><string>Approval required to upload image files.</string><key>NSUserTrackingUsageDescription</key><string>We need your permission to use the Advertising Identifiers (IDFA) for promotion targeting and tracking analysis.</string>12345678910111213141516171819<key>LSApplicationQueriesSchemes</key><array><string>weixin</string><string>vk-share</string><string>vkauthorize</string><string>vk</string><string>weixinULAPI</string><string>fbapi</string><string>fb-messenger-api</string><string>fbauth2</string><string>fbshareextension</string><string>mqqOpensdkSSoLogin</string><string>mqqopensdkapiV2</string><string>lineauth2</string><string>mqqopensdkapiV3</string><string>wtloginmqq2</string><string>mqq</string><string>mqqapi</string></array>12<key>FacebookAppID</key><string>926000000000000</string><key>FacebookClientToken</key><string>d123783h7sdfyh8031h23unf81h3</string>123456789101112131415161718192021222324252627<key>CFBundleURLTypes</key><array><!--Facebook 이용을 위함. 여러분의 앱의 Facebook App ID 값을 넣어 주세요--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>fb926000000000000</string></array></dict><!--Hive에서 딥링크 사용을 위함. 여러분의 AppID 값을 넣어 주세요--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>com.com2us.misample.normal.freefull.apple.global.ios.universal</string></array></dict><!--Google Sign-in을 위함. 여러분 앱의 Google Sign-in 키 값을 넣어 주세요--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>com.googleusercontent.apps.270000000000-0m7r8tb2co1q00000000000000000000</string></array></dict><!--QQ Sign-in을 위함. 여러분 앱의 QQ 키 값을 넣어 주세요--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>tencent</string><key>CFBundleURLSchemes</key><array><string>tencent1106227203</string></array></dict><!--Wechat Sign-in을 위함. 여러분 앱의 Wechat 키 값을 넣어 주세요--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>weixin</string><key>CFBundleURLSchemes</key><array><string>wx78176cf0c698c0f9</string></array></dict><!--VK Sign-in을 위함. 여러분 앱의 VK 키 값을 넣어 주세요--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>vk6270065</string><key>CFBundleURLSchemes</key><array><string>vk6270065</string></array></dict><!--Line Sign-in을 위함--><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string></array></dict></array>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596<key>NSCameraUsageDescription</key><string>Approval required to take pictures.</string><key>NSContactsUsageDescription</key><string>You must agree to add friends from your Contacts.</string><key>NSPhotoLibraryUsageDescription</key><string>Approval required to upload image files.</string><key>NSUserTrackingUsageDescription</key><string>We need your permission to use the Advertising Identifiers (IDFA) for promotion targeting and tracking analysis.</string><key>FacebookAppID</key><string>1809615065921877</string><key>FacebookClientToken</key><string>c41e47ba5512ea3fb5bfb29d5cfeb244</string><key>CFBundleURLTypes</key><array><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string></array></dict><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>fb926000000000000</string></array></dict><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>com.com2us.hivesdk.normal.freefull.apple.global.ios.universal</string></array></dict><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>com.googleusercontent.apps.331526026701-s41n272jsv6c0f72kt5o7of0jns350gl</string></array></dict><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>tencent</string><key>CFBundleURLSchemes</key><array><string>tencent1106227203</string></array></dict><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>weixin</string><key>CFBundleURLSchemes</key><array><string>wx78176cf0c698c0f9</string></array></dict><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>vk6270065</string><key>CFBundleURLSchemes</key><array><string>vk6270065</string></array></dict></array><key>LSApplicationQueriesSchemes</key><array><string>weixin</string><string>vk-share</string><string>vkauthorize</string><string>vk</string><string>weixinULAPI</string><string>fbapi</string><string>fb-messenger-api</string><string>fbauth2</string><string>fbshareextension</string><string>mqqOpensdkSSoLogin</string><string>mqqopensdkapiV2</string><string>lineauth2</string><string>mqqopensdkapiV3</string><string>wtloginmqq2</string><string>mqq</string><string>mqqapi</string></array> - Apple SignIn 지원을 위해 프로젝트 폴더 > Config > DefaultEngine.ini 파일 내 아래 코드를 추가하세요.
1 |
bEnableSignInWithAppleSupport=True |
Firebase Analytics 추가하기
/Plugins/HIVESDK/Source/HIVESDK/ThirdParty/iOS/resource
다국어 설정파일 적용하기
- 다국어 설정 파일 > localize 폴더 하위의 폴더들을 다음 경로에 넣어주세요.
/Plugins/HIVESDK/Source/HIVESDK/ThirdParty/iOS/resource
HIVEAppDelegate 적용하기
게임시작시 초기화하는 단계에서 아래 코드를 추가해주세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//////////////////////////////////////////////////////////////// // IOSAppDelegate.h 헤더 추가 #if PLATFORM_IOS #include "Runtime/ApplicationCore/Public/iOS/IOSAppDelegate.h" #endif //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// // AppDelegate 추가코드 본문 #if PLATFORM_IOS UIApplication * dummyApplication = [UIApplication sharedApplication]; Class clzHIVEAppDelegate = NSClassFromString(@"HIVEAppDelegate"); SEL selApplicationDidFinishLaunchingWithOptions = NSSelectorFromString(@"application:didFinishLaunchingWithOptions:"); if( clzHIVEAppDelegate != nil && [clzHIVEAppDelegate respondsToSelector:selApplicationDidFinishLaunchingWithOptions] ) { NSMethodSignature *method = [clzHIVEAppDelegate methodSignatureForSelector:selApplicationDidFinishLaunchingWithOptions]; if (method != nil) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:method]; [invocation setSelector:selApplicationDidFinishLaunchingWithOptions]; [invocation setTarget:clzHIVEAppDelegate]; [invocation setArgument:(void*)&dummyApplication atIndex:2]; NSDictionary *localLaunchOptions = [IOSAppDelegate GetDelegate].launchOptions; if( localLaunchOptions != nil ) { [invocation setArgument:(void*)&localLaunchOptions atIndex:3]; } [invocation invoke]; } } #endif //////////////////////////////////////////////////////////////// |
iOS FMallocAnsi 설정하기
Unreal Engine iOS 환경과 C++ 표준 템플릿 라이브러리가 정상적으로 호환되려면 아래와 같이 FMallocAnsi 설정이 필요합니다.
게임 프로젝트의 {YourProject}.Target.cs
파일에 다음 코드를 추가합니다.
1 2 3 4 5 6 7 8 9 10 11 |
public class YourProjectTarget : TargetRules { public YourProjectTarget(TargetInfo Target) : base(Target) { // 게임 클라이언트에 대한 ANSI 할당자 강제 실행 if(Target.Platform == UnrealTargetPlatform.IOS) { GlobalDefinitions.Add("FORCE_ANSI_ALLOCATOR=1"); } } } |
Hive 설정하기
다음의 안내에 따라 Hive 사용을 위한 설정 항목을 설정하세요. 여러분이 설정 값을 변경하면 Unreal Editor의 값은 자동으로 저장되며, 설정 값을 저장하는 파일(hive_config.xml, etc_string.xml, GooglePlayAppID.xml)의 값 역시 변경 사항을 반영해 자동 저장됩니다. 설정 값 파일이 없으면 Hive SDK가 자동으로 생성하며, 파일은 다음 위치에서 찾을 수 있습니다:
- Android:
<프로젝트_루트>/Plugins/HIVESDK/Source/HIVESDK/ThirdParty/android/resource/res/raw
- iOS:
<프로젝트_루트>/Plugins/HIVESDK/Source/HIVESDK/ThirdParty/iOS/resource/
Hive에서 필요한 값을 설정하기 위해 다음의 안내를 따르세요:
- Unreal Editor의 메뉴에서 편집 > 프로젝트 세팅을 클릭하세요. 프로젝트 설정 창이 화면에 나타납니다.
- 프로젝트 설정 창의 좌측 패널에서 플러그인 제목 아래의 HIVEConfig XML 메뉴를 클릭하세요. HIVEConfig XML 설정 화면이 나타납니다.
- HIVEConfig XML 화면에서 다음의 안내대로 설정 항목을 변경하세요:
- Facebook Settings 그룹의 Facebook App ID 필드에 게임에 대한 Facebook AppID를 입력하세요. 게임에 대한 Facebook AppID 값을 모른다면 선행 작업 섹션을 읽어 보세요.
- Google Play Settings 그룹의 Google Play App ID 필드에 게임빌이나 컴투스로부터 전달 받은 Google Play Game Service AppID를 입력하세요.
- HiveConfig Settings 그룹: hive_config.xml 파일에서 설정하는 값 중 다음 값을 설정할 수 있습니다.
- HiveConfig Mobile App Tracking Settings: 이용할 마케팅 어트리뷰션에 대한 설정 값을 입력하세요. 이용할 마케팅 어트리뷰션 대시보드에서 발급 받은 AppID, 키 혹은 토큰 값을 입력하세요.
마케팅 어트리뷰션 설정 가이드 보기 - WriteExternalStoragePermission: Android에서 필요한 값으로, 외부 저장소 사용 권한을 유저에게 요청할 지 여부를 설정합니다. 체크하면 Hive 클라이언트가 단말기에서 초기화 될 때, 유저에게 외부 저장소 권한을 요청합니다.
iOS
Hive SDK v4를 적용하려면, xcode의 빌드 방식을 Legacy Build로 변경해야 합니다.
아래와 같이, 좌측 패널의 프로젝트 세팅 > 플랫폼 > Xcode 프로젝트 항목에서 최신 Xcode를 체크 해제합니다.
Hive 기능 선택 적용하기
인증, 애널리틱스 등에서 사용할 Hive 기능만 선택하여 적용하려면, 아래의 순서에 따라 Hive 라이브러리 의존성을 설정하세요.
- Unreal Editor의 메뉴에서 Edit > Project Settings을 클릭하세요. Project Settings 창이 나타납니다.
- Project Settings 창의 좌측 패널에서 Hive SDK 하위의 Dependency – Android / Dependency – iOS를 각 클릭하세요.
- Hive SDK Dependency – Android / Hive SDK Dependency – iOS 각 창에서 사용할 기능에 대한 라이브러리 의존성을 선택하세요.
빌드하기
Unreal Engine을 이용한다면 OS별로 다음 안내에 따라 빌드해주세요.
Android 빌드하기
빌드 설정하기
Google Play Store에 앱을 배포하기 위한 항목을 다음의 안내대로 설정하세요.
- Signing Key 설정하기:
- Unreal Editor의 메뉴에서 편집 > 프로젝트 세팅을 클릭하세요. 프로젝트 설정 창이 화면에 나타납니다.
- 프로젝트 설정 창의 좌측 패널에서 플랫폼 제목 아래의 안드로이드 메뉴를 클릭하세요. 안드로이드 설정 화면이 나타납니다.
- 안드로이드 설정 화면에서 Distribution Signing 그룹의 필드에 Signing Key 정보를 입력하세요.
- 패키징 설정하기:
- 프로젝트 설정 창의 좌측 패널에서 프로젝트 제목 아래의 패키징 메뉴를 클릭하세요. 패키징 설정 창이 나타납니다.
- 패키징 설정 화면의 Project 그룹의 For Distribution 필드를 체크하세요.
빌드하기
Hive가 포팅된 Android 용 게임을 빌드하는 방법은 Unreal Editor에서 일반 Android 앱을 빌드하는 방법과 동일합니다. Unreal Editor에서 파일 > 프로젝트 패키징 > 안드로이드 메뉴를 이용하세요.
빌드 방법에 대한 자세한 내용은 Unreal에서 제공하는 가이드를 참고하세요.
iOS 빌드하기
Hive가 포팅된 iOS 용 게임을 빌드하는 방법은 Unreal Editor에서 일반 iOS 앱을 빌드하는 방법과 동일합니다. Unreal Editor에서 파일 > 프로젝트 패키징 > iOS 메뉴를 이용하세요.
빌드 방법에 대한 자세한 내용은 Unreal에서 제공하는 가이드를 참고하세요.