구글플레이서비스와 IN-APP BILLING 구글플레이서비스 + In-app Billing 사용설정 안드로이드구글플레이서비스지원 리더보드 업적 구글플레이 In-app Billing 지원 Google Play Developer Console 에새애플리케이션추가 추가한애플

Similar documents
왜이컨텐츠가쿠킹되고포함되지? 앱사이즈줄여보기 패키지크기줄이기 패키지크기줄이기 문서로시작하세요. esize/index.html 프로젝트세

PowerPoint Presentation

모바일개발환경설정 안드로이드개발준비 안드로이드개발을위한 SDK 설치 엔비디아의 Tegra Andorid Development Pack(TADP) 를추천 Unreal Engine\4.7\Engine\Extras\Android 에서찾으실수있음 TADP 개발자프로그램가입을통

Microsoft Word - src.doc

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

서현수

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

- 목차 - - ios 개발환경및유의사항. - 플랫폼 ios Project. - Native Controller와플랫폼화면연동. - 플랫폼 Web(js)-Native 간데이터공유. - 플랫폼확장 WN Interface 함수개발. - Network Manager clas

HTML5* Web Development to the next level HTML5 ~= HTML + CSS + JS API

Install stm32cubemx and st-link utility

Facebook API

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

슬라이드 1

Android Master Key Vulnerability

게시판 스팸 실시간 차단 시스템

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

ISP and CodeVisionAVR C Compiler.hwp

PowerPoint Template

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

Chapter 1

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

ICT03_UX Guide DIP 1605

BEA_WebLogic.hwp

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

SBR-100S User Manual

SIGIL 완벽입문

Windows 10 General Announcement v1.0-KO

PowerPoint 프레젠테이션

Æí¶÷4-¼Ö·ç¼Çc03ÖÁ¾š

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

17장 클래스와 메소드

슬라이드 1

유니티 변수-함수.key

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

ICAS CADWorx SPLM License 평가판설치가이드

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

Microsoft Word - 문필주.doc

System Recovery 사용자 매뉴얼

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

UI TASK & KEY EVENT

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Spring Boot

리눅스설치가이드 3. 3Rabbitz Book 을리눅스에서설치하기위한절차는다음과같습니다. 설치에대한예시는우분투서버 기준으로진행됩니다. 1. Java Development Kit (JDK) 또는 Java Runtime Environment (JRE) 를설치합니다. 2.

View Licenses and Services (customer)

F120L(JB)_UG_V1.0_ indd

Web Scraper in 30 Minutes 강철

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

어댑터뷰

Microsoft PowerPoint 웹 연동 기술.pptx

THE TITLE

Secure Programming Lecture1 : Introduction

YUM(Yellowdog Updater,Modified) : RPM 패키지가저장된서버 ( 저장소 ) 로부터원하는패키지를자동으로설치한다. : YUM 도구는 RPM 의패키지의존성문제를해결

adfasdfasfdasfasfadf

Chapter #01 Subject

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

멀티미디어 콘텐츠 접속을 위한 사용자인증 시스템_교열(박세환, ).hwp

슬라이드 1

MVVM 패턴의 이해

정보

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

PowerPoint 프레젠테이션

gcloud storage 사용자가이드 1 / 17

Studuino소프트웨어 설치

PowerPoint 프레젠테이션

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot)

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

PowerPoint Presentation

사용설명서를 읽기 전에 안드로이드(Android)용 아이디스 모바일은 네트워크 연결을 통해 안드로이드 플랫폼 기반의 모바일 기기에서 장치 (DVR, NVR, 네트워크 비디오 서버, 네트워크 카메라) 에 접속하여 원격으로 영상을 감시할 수 있는 프로그램입니다. 장치의 사

PowerPoint 프레젠테이션

HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 :

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

[Blank Page] i

4. Compass 명령어를알아보자. compass <command> [<option>, <option>, <option>.. <option>] command : 명령어. clean - Remove generated files and the sass cache. com

C# Programming Guide - Types


Microsoft Word - FunctionCall

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap01-C언어개요.pptx

NTD36HD Manual

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

왜곡보정버전업그레이드순서 - Windows 판 - 니콘제품을애용해주셔서대단히감사합니다. 여기에서는왜곡보정의버전업그레이드에대해설명하고있습니다. 그리고니콘서비스센터에서의업데이트도받고있으므로사용하시는환경등으로펌웨어를업데이트할수없는사용자는이용하여주십시오. 사용하시는카메라사용법

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

JUNIT 실습및발표

Cisco FirePOWER 호환성 가이드

디지털 공학

PowerPoint 프레젠테이션

iOS5_1±³

슬라이드 1

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR

PowerPoint 프레젠테이션

사용하기 전에 2

Transcription:

UE4 슈퍼파월 ~! 모바일게임서비스기능알아보기 신광섭 Developer Relations Manager/Programmer Epic Games Korea 목차 구글플레이서비스 + In-app Billing HttpRequest 안드로이드패치 1

구글플레이서비스와 IN-APP BILLING 구글플레이서비스 + In-app Billing 사용설정 안드로이드구글플레이서비스지원 리더보드 업적 구글플레이 In-app Billing 지원 Google Play Developer Console 에새애플리케이션추가 추가한애플리케이션에 APK 를업로드필요 업로드하는앱은 Debug 가활성화되지않은 Release 모드로 Signing 된앱필요 Signing 관련설정은자세한사용법은 모바일개발설정과패키징 세션 ppt 참고 2

구글플레이서비스 + In-app Billing 사용설정 Release 모드로 Signing 된앱만들기 장단이있어서기본적으로는안되지만혹시나 실행 버튼이 Release 모드로 Signing 된앱이생성되면어떨지생각하신다면? In-App Purchase 등등테스트에는 Release 모드로 Signing 된앱이있어야하므로코드수정및테스트 iteration 에유용 간단한코드수정을통해서이런접근도가능 구글플레이서비스 + In-app Billing 사용설정 Engine/Source/Developer/LauncherServices/LauncherServices.Build.cs 에 PrivateDependencyModuleNames 에 UnrealEd 추가 Engine/Source/Developer/LauncherServices/Private/Launcher/LauncherUATTask.h 에 UATCommandLine = FString::Printf 부분을중심으로아래와같이 UProjectPackagingSettings* PackagingSettings = Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject()); FString OptionalParams; if (PackagingSettings->ForDistribution) { OptionalParams += TEXT(" -distribution"); } // base UAT command arguments FString UATCommandLine; FString ProjectPath = *ChainState.Profile->GetProjectPath(); ProjectPath = FPaths::ConvertRelativePathToFull(ProjectPath); FString Configuration = FindObject<UEnum>(ANY_PACKAGE, TEXT("EProjectPackagingBuildConfigurations"))->GetEnumName(PackagingSettings->BuildConfiguration); Configuration = Configuration.Replace(TEXT("PPBC_"), TEXT("")); UATCommandLine = FString::Printf(TEXT("BuildCookRun -project=\"%s\" -nop4 -clientconfig=%s -serverconfig=%s"), *ProjectPath, *Configuration, *ConfigStrings[ChainState.Profile->GetBuildConfiguration()]); UATCommandLine += Rocket; 이런식으로수정 UATCommandLine += NoCompile; UATCommandLine += OptionalParams; Engine/Source/Developer/LauncherServices/Private/LauncherServicesPrivatePCH 에 #include "Settings/ProjectPackagingSettings.h 추가 3

구글플레이서비스 + In-app Billing 사용설정 Release Signing 된앱만들기 이제준비된 Release 모드 Singing 된 APK 을베타 / 알파테스트에업로드 업로드된앱을출시 In-app Billing 등을테스트하기위해서는꼭출시됨이여야함 Google Play Developer Console 에서 Google Play 게임서비스활성화 https://developers.google.com/games/services/console/enabling 참고 구글플레이서비스 + In-app Billing 사용설정 프로젝트에 Google Play Services 세팅하기 C++ 프로젝트를사용하신다면사용하시는게임프로젝트모듈.Build.cs 에아래부분추가해서빌드 if (Target.Platform == UnrealTargetPlatform.IOS) { PrivateDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "OnlineSubsystem", "OnlineSubsystemUtils" }); DynamicallyLoadedModuleNames.Add("OnlineSubsystemFacebook"); DynamicallyLoadedModuleNames.Add("OnlineSubsystemIOS"); DynamicallyLoadedModuleNames.Add("IOSAdvertising"); } else if (Target.Platform == UnrealTargetPlatform.Android) { PrivateDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "OnlineSubsystem", "OnlineSubsystemUtils" }); DynamicallyLoadedModuleNames.Add("AndroidAdvertising"); DynamicallyLoadedModuleNames.Add("OnlineSubsystemGooglePlay"); } 4

구글플레이서비스 + In-app Billing 사용설정 프로젝트세팅에안드로이드에 Google Play Services 항목설정 Enable Google Play Support 체크 Google Play 게임서비스의 Games App ID 입력 추가한애플리케이션의 Goole Play License Key 입력 구글플레이서비스 + In-app Billing 사용설정 In-app Billing 활성화를위해서게임프로젝트 \Config\Android\AndroidEngine.ini 에 [OnlineSubsystemGooglePlay.Store] bsupportsinapppurchasing=true 추가 여기까지설정하면기본준비는완료! 5

구글플레이서비스사용하기 업적과리더보드 ID 등록하기 프로젝트세팅에안드로이드항목에 Achievement Map 과 Leaderboard Map Name 은 UE4 내부에서사용되는 ID 개념 Achievement/Leardboard ID 는구글플레이콘솔에서얻은실제 ID 값 구글플레이서비스사용하기 업적과리더보드 ID 등록하기 프로젝트세팅에안드로이드항목에 Achievement Map 과 Leaderboard Map Name 은 UE4 내부에서사용되는 ID 개념 Achievement/Leardboard ID 는구글플레이콘솔에서얻은실제 ID 값 이렇게준비하면일단업적과리더보드사용준비는완료. 6

구글플레이서비스 + In-app billing 사용 이렇게준비된서비스들을블루프린트에서는 Online 에있는항목들을통해서 코드에서는 IOnlineSubsystem::Get(FName(TEXT( GooglePlay"))) 로 OnlineSubsystem을얻어서필요한서비스인터페이스를접근해서함수호출해서사용가능 In-app billing 그런데만약구글플레이서비스가아니라 In-app billing 만사용하고싶다면? 현재는모든서비스들이활성화되는것이기본으로코드수정을통해서구글플레이서비스는사용되지않도록가능 OnlineSubsystemGooglePlay.cpp 에 FOnlineSubsystemGooglePlay::Init() 함수에서 // Queue up a task for the login so that other tasks execute after it. 부터 return true; 전까지코드를제거하고, 거기서추가로 FJavaWrapper::OnActivityResultDelegate.AddRaw(this, &FOnlineSubsystemGooglePlay::OnActivityResult); 만호출하게하시면 Games App ID 등을설정안하셔서도크래쉬없이 In-app billing 만사용가능 7

HTTP HTTP Request HTTP 프로토콜을쓰는것이게임에많이쓰이고있음 UE4 에서는 HttpRequest 를통해서 HTTP 프로토콜을사용가능 단, 블루프린트에서가능한인터페이스는아직공식적으로없지만 UE4 유저가플러그인을만들어서공개한상태 VaRest Plugin https://wiki.unrealengine.com/varest_plugin VaRest Plugin 을통해서 HTTP 프로토콜사용이가능! 8

HTTP Request 소울던전에서는테스트로 HTTP 서버를사용해서랭킹정보의저장하고가져오는데 VaRest 플러그인을통해서블루프린트에서처리 이플러그인이외에도 JSON Query 플러그인도존재 https://forums.unrealengine.com/showthread.php?7045-plugin-json- Query&highlight=JSON+QUERY HTTP Request 코드를통한사용법 FHttpModule 을사용하면편하게가능 TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest(); HttpRequest->SetVerb( GET"); HttpRequest->SetURL(TEXT( http://www.google.com )); HttpRequest->OnProcessRequestComplete().BindUObject(this, &TestClass::OnTestFuncCo mpleted); HttpRequest->ProcessRequest(); Callback 함수는 void TestClass::OnTestFuncCompleted(FHttpRequestPtr Request, FHttpResponsePtr Respon se, bool bwassuccessful) 9

안드로이드패치 안드로이드패치 구글플레이의 APK 50MB 제한이기에컨텐츠에대한해결책필요 구글은컨텐츠데이터를위한 OBB 를지원하고있음 UE4 도기본적으로패키지프로젝트를통해서안드로이드플랫폼패키징시에 APK 와 OBB 파일을생성해줌 4.8 버전에서 OBB 다운로드시스템이지원되어 APK 와 OBB 를통한컨텐츠데이터서버비용없이게임서비스가능 10

안드로이드패치 하지만패치의용의함과패치사이즈등의여러가지이슈로자체패치서버와패치시스템을사용하는것이한국에서는일반적인모바일서비스방법 그렇다면 UE4 에이런솔루션은없을까? 있습니다! 가능! UE4 패치시스템시나리오 UE4 안드로이드패치시스템은엔진이구동되어실행한상태에서동작가능 즉, APK 가구동을위한컨텐츠들을포함하여배포가되어야함 50MB 으로 APK 를만들어야하기때문에최소한의컨텐츠만포함해함 무엇을포함해야하고어떻게만들어야할까? 11

UE4 패치시스템시나리오 APK 만들기 컨텐츠가포함된 APK 를만들기위해서프로젝트세팅에 Package game data inside.apk? 옵션을체크 이상태로그냥패키징을하게되면전체맵을포함하게되고, 프로젝트런쳐를쓰게되도우리가원하는 (?) 을다하지못함 UE4 패치시스템시나리오 APK 만들기 모바일개발설정과패키징 세션을보셨다면익숙하실 AutomationTool(Engine\Build\BatchFiles\RunUAT.bat) 을이용해서원하는방식으로패키징된 APK 를만듬 우리가원하는것은 50MB 이하의 APK 를만들로패치에대한정보만보여주는최소한의시작레벨만가지고모든안드로이드디바이스에서구동이되는텍스쳐포맷을가지는 APK 를만들어야하는조건 이조건을충족하기위해서텍스쳐포맷은 ETC1 을사용 잘알고계시겠지만알파채널이없는완전비추텍스쳐포맷 하지만모든안드로이드디바이스는이텍스쳐포맷을지원 12

UE4 패치시스템시나리오 APK 만들기 패치관련해서기본배경화면이나배치여부를묻는등꼭필요한기본 UI 만표시하는아주간단한패치타이틀맵을만듬 소울던전테스트에서는아주간단하게 Wifi 연결시에패치실행하는것을추천한다는메시지창과패치시작시프로그레스바표시만하는 UI 구성 UE4 패치시스템시나리오 APK 만들기 더나아가서 UE4 에는사이즈를줄이기위한좋은기능이있음 UE4 에서는배포용컨텐츠는보안과기타의이유로그냥 uasset 파일들이아니라.pak 파일이라는컨텐츠들이합쳐진파일을배포하는것을지원 이.pak 파일로기본적으로사이즈가줄어드는것은아니지만! 압축옵션지원! 그래서우리가사용할 AutomationTool 을실행할 commandline 은 RunUAT.bat BuildCookRun -project=" 프로젝트파일전체경로 " -nop4 -clientconfig=development -platfo rm=android_etc1 -targetplatform=android -cookflavor=etc1 -cook -map= 패치를위한타이틀맵이름 -sta ge -package -cmdline= 패치를위한타이틀맵이름 -compressed -pak 이조건이면기본 APK 생성가능! 단, 실행전에프로젝트세팅에맵 & 모드에 Game Default Map 을패치를위한타이틀맵으로설정을해야추가적으로필요없는다른 Game Default Map 포함이되지않음 13

UE4 패치시스템시나리오 다음으로패치데이터만들기 패치데이터는먼저 APK 에포함된데이터는작더라도빼고만들어야좋은데그럼어떻게 APK 에포함된데이터를분리할수있을까? UE4 에새로추가중 (?) 인 DLC(Downloadable Content) 기능이용! DLC 는이미배포된컨텐츠를제외하고추가적인컨텐츠를배포할때유용한기능 패치데이터생성에도이용하면초기 APK 에포함된데이터를제외한패치해야하는컨텐츠데이터를만들수있음 UE4 패치시스템시나리오 DLC 를활성화한쿠킹법 AutomationTool 을통해서쿠킹 유저가실제받는다운로드받는패치사이즈를줄이기위해서모든텍스쳐포맷에대해서배포버전에포함된컨텐츠정보를만들어두어야함 Android_DXT 포맷에대한실행 commandline 은 Engine\Build\BatchFiles\RunUAT.bat BuildCookRun -project=" 프로젝트파일전체경로 " -nop4 - clientconfig=development -serverconfig=development -platform=android_dxt -targetplatform=android - cook -cookflavor=dxt -map= 패치를위한타이틀맵이름 -stage -cmdline= 패치를위한타이틀맵이름 -Messaging -nocompile -compressed -pak -CreateReleaseVersion=1.0 -newcook -platform=android_dxt 와 -cookflavor=dxt 부분을지원할안드로이드텍스쳐포맷들에대해서변경해서전부실행예 ) -platform=android_atc -cookflavor=atc -platform=android_etc2 -cookflavor=etc2 14

UE4 패치시스템시나리오 DLC 을이렇게쿠킹하고나면 게임프로젝트 /Releases/1.0/ 아래에플랫폼이름의폴더가생성되어있고, 그안에초기배포된어셋정보들에대한 AssetRegistry.bin 파일이생성되어있음 (1.0 은 AutomationTool 실행시에 CreateReleaseVersion 에설정한버전명 ) DLC 기반쿠킹시에이정보를기초로초기배포패키지는제외한쿠킹컨텐츠들을만들게됨 UE4 패치시스템시나리오 이제실제배포할 DLC 컨텐츠쿠킹을먼저하면 Engine\Build\BatchFiles\RunUAT.bat BuildCookRun -project=" 프로젝트파일전체경로 " - nop4 -clientconfig=development -serverconfig=development -platform=android_dxt - targetplatform=android -cook -cookflavor=dxt -map= 배포할맵 + 배포할맵 -stage -pak - nocompile -BasedOnReleaseVersion=1.0 -DLCName=DLC 이름 -NEWCOOK 이항목도배포할버전의텍스쳐포맷을위해서 -platform 과 cookflavor 항목을수정해서각텍스쳐별로쿠킹필요 -map 에는배포할맵이름들을 + 를이용해서넣어주면됨 DLCName 은원하는이름을적당히정해주시면됨 15

UE4 패치시스템시나리오 이렇게쿠킹을완료하면초기에 APK 에포함된컨텐츠를제외한컨텐츠만쿠킹된데이터들이 게임프로젝트 \Plugins\DLC 이름 \Saved\Cooked\ 플랫폼 아래에쿠킹된 uasset 들이 게임프로젝트 \Plugins\DLC 이름 \Saved\StagedBuilds\ 플랫폼 아래에는쿠킹된 uasset 들로만들어진 Pak 파일이생성되어있음 우리가실제배포할패치데이터는 StagedBuilds\ 플랫폼폴더를사용해서만들게됨 UE4 패치시스템시나리오 이제배포될컨텐츠까지다완성이된상태 이제필요한작업은어떻게만들어진.pak 파일을유저가다운로드받을수있게해줄것인가? 이제핵심적인패치만들기기능과패치다운로드기능을살펴볼차례 16

다운로드데이터제작 - BuildPatchTool 다운로드받을데이터를제작하기위해서사용하는툴은 Engine\Binaries\Win64\BuildPatchTool.exe 기본적으로언리얼런쳐에서엔진이나기타다른컨텐츠배포를위해서만들어진툴! 다운로드받는데이터를만들기위한좋은기능을가지고있고계속진화중! 다운로드데이터제작 - BuildPatchTool 그럼전에단계에서만든.pak 파일을다운로드받을수있는파일들로만들어보면 Engine\Binaries\Win64\BuildPatchTool.exe -BuildRoot= 프로젝트폴더경로 \Plugins\DLC 이름 \Saved\StagedBuilds\ 플랫폼이름 " -CloudDir= 만들어진다운로드데이터들저장경로 " -AppID=0 -AppName= MyGame" - BuildVersion= MyGame-1" - AppLaunch=".\Engine\Binaries\Win64\UE4Editor.exe" -AppArgs="" - customint="chunkid=1" 이렇게실행하면아까만들어진.pak 들을청크단위로쪼개서그쪼개진파일들과그정보를가지고있는 manifest 파일을 CloudDir 폴더에생성해줌 AppName은크게중요한것은아니고, 추후에버전이UNREAL 올라갈수SUMMIT 있으니 2015 17

다운로드데이터제작 - BuildPatchTool 가장좋은것은각디바이스에서자기가지원하는가장좋은텍스쳐포맷컨텐츠만다운로드하는것이기때문에전에텍스쳐포맷별로만들어둔.pak 파일들에모두실행해서각각의텍스쳐별버전을만드는것을추천 청크가만들어진 CloudDir 폴더를살펴보면 AppNameBuildVersion.binary.manifest AppNameBuildVersion.manifest ChunksV3 폴더이렇게 3 개가생성되어있음 Manifest 파일은어떤파일이어떤청크들로나누어져있는지정보가있고, 나중에이파일을다운로드해서다운로드받아야하는청크와복구를하는정보로사용됨 ChunksV3 폴더안에는청크로나누어진폴더와그밑에는청크파일들이있음 다운로드데이터제작 - BuildPatchTool 청크로만드는시스템의큰장점은원본파일을청크단위로쪼개면서각각청크바이너리데이터가같은값을가지고있으면다시만들지않고그값을재활용해서결국원본.pak 가청크로나누어지면실제다운로드사이즈가작어질수있음! 소울던전테스트에서는 500MB 가 300MB 정도로작어진경우도보임 18

청크다운로드받기 - BuildPatchServices 이제만들어진청크들을어떻게다운받아서복구해야할까? Manifest 기반으로필요한청크를다운받아서복구하는모듈인 BuildPatchServices 모듈지원! Amazon S3 같은웹호스팅서버에파일을올리고그 URL 과 manifest 파일을통해서필요한청크를알아서다운로드받아서복구해주는아주멋진녀석! 청크다운로드받기 - BuildPatchServices 실제모듈클래스이름은 IBuildPatchServicesModule 그럼어떤방식으로사용하면되는지살펴보면 다운로드할수있도록 Manifest 파일과그청크들을웹호스팅서버에올려둠 Manifest 파일을먼저다운로드해서 IBuildPatchServicesModule 에게다운로드받아야하는파일을알려줄준비를함 Manifest 들이다운로드받은청크파일들이어디있는지웹서버주소를 IBuildPatchServicesModule 에게세팅 기타디바이스에서다운로드와복구된파일을넣을패스를정해서 IBuildPatchServicesModule 에세팅 IBuildPatchServicesModule 에게다운로드하라고요청! 19

청크다운로드받기 - BuildPatchServices 그럼이제각각의단계를좀더자세히살펴보면 다운로드를받기위해서 BuildPatchServices 모듈로딩 IBuildPatchServicesModule* BuildPatchServices = &FModuleManager::LoadModuleChecked<IBuildPatchServicesModule>(TEXT("BuildPatchServices")); HttpRequest 를통해서 Manifest 파일을다운로드 웹서버를구축하셔서앱에서어떤 Manifest 파일을사용해야하는지, 아니면해당 Manifest 정보를넘겨주는시스템필요 웹서버에서넘겨받은 Manifest 파일정보가 JSON 이라면 BuildPatchServices->MakeManifestFromJSON 바이너리데이터로받아왔으면 BuildPatchServices->MakeManifestFromData 함수를통해서 IBuildManifestPtr 생성 청크다운로드받기 - BuildPatchServices Manifest 파일에서필요한다운로드받을청크폴더가있는 URL 설정 BuildPatchServices->SetCloudDirectory(CloudURL); 디바이스에서다운로드받은청크파일들로복구된파일들을완전히복구되어최종위치에복사되기전에임시로저장될폴더위치지정 안드로이드디바이스에서앱이사용하는경로를가져와야하고, 그경로는 AndroidFile.cpp 에이미선언되어있고, GExternalFilePath 이며사용하시는소스코드에서 extern FString GExternalFilePath; 이렇게해서사용하게가져오시면됨 이 GExternalFilePath 경로에예를들면 StageDir = FPaths::Combine(*PatchFilePath, TEXT("Patches"), TEXT("Staged")); 이런식으로해서설치경로를설정 설정된설치경로를세팅 BuildPatchServices->SetStagingDirectory(StageDir); 20

청크다운로드받기 - BuildPatchServices 이제다운로드받은청크를기반으로필요한파일이있으면어느폴더에설치가될지정하는폴더를지정하는것이필요 GExternalFilePath 를기반으로적당한폴더패스를만듬. 예를들면 InstallDir = FPaths::Combine(*GExternalFilePath, TEXT("Patches"), TEXT("Installed")); 이제실제청크를다운로드받고, 복구하는일을지시하기! BuildInstaller = BuildPatchServices->StartBuildInstall(nullptr, InstallManifest, InstallDir, FBuildPatchBoolManifestDelegate::CreateRaw(this, &FMobilePatchManager::OnDownloadCompleted)); StartBuildInstall 함수호출로작업지시를할수있음 만들어둔 IBuildManifestPtr 인스턴스, 설치될경로, 다운로드와복구완료시에이벤트를받을 delegate 함수를지정 청크다운로드받기 - BuildPatchServices IBuildInstallerPtr BuildInstaller = BuildPatchServices->StartBuildInstall( ) 호출로넘겨받은 IBuildInstallerPtr 인스턴스는유용한인스턴스 IBuildInstallerPtr 를통해서다운로드와복구작업을포함한전체진행상황얻어오기 BuildInstaller->GetUpdateProgress(); 앱이백그라운드로가고다시복귀했을때다운로드와복구를멈춤 / 재시작할수있는함수호출 BuildInstaller->TogglePauseInstall() ( 참고 : 앱이백그라운드로가고다시돌아오고는 FCoreDelegates::ApplicationWillEnterBackgroundDelegate.AddRaw FCoreDelegates::ApplicationHasEnteredForegroundDelegate.AddRaw 등의 Delegate 를통해서알수있음 ) 21

청크다운로드받기 - BuildPatchServices 다운로드와복구가잘완료되어서완료 Delegate 를받으면이제필요한것은우선사용된 Manifest 파일을저장하는것 그리고필요한것은다운로드받아서복구한.pak 파일을시스템에서찾을수있도록등록하는것! 다운로드받은.pak 파일을 IPlatformFile::FDirectoryVisitor 상속받은간단한헬퍼클래스를만들어서 InstallDir 에서.pak 파일을찾도록함 찾아진.pak 파일을 FCoreDelegates::OnMountPak.Execute(PakPath, 0) 를호출하면시스템에.pak 파일이등록됨 이제실제타이틀레벨을로딩하면다운로드.pak 에서찾아서로딩되고게임가능! 청크다운로드받기 - BuildPatchServices 그럼마지막으로사용한 Manifest 파일을저장하는이유는무얼까? 그것을살펴보기전에그렇다면처음만들어서배포한.pak 에업데이트가필요해서패치를해야한다면어떻게될까를먼저생각해보면? 예를들어.pak 버전 1 을받은유저가한동안업데이트하지않아서한달후에접속해서버전 100 이 (?) 되었다면? 그유저는 2-100 까지다받아야할까? 우리가원하는것은마지막버전의.pak 파일을복원하는것이다그전의단계는중요하지않음 그렇기때문에버전 100 의 manifest 파일에필요한청크파일들만서버에있다면그버전 100 의 Manifest 파일을통해서 StartBuildInstall 호출에넘겨서다운로드받으면됨 22

청크다운로드받기 - BuildPatchServices 그런데그렇다면우리는버전 100 에해당하는모든청크를다운로드받아야하는것일까? 전에받은마지막.pak 파일에서일부분만바뀌었는데도? 그렇지않음! 이이유로마지막다운로드받은 Manifest 파일을저장한것 BuildPatchServices->StartBuildInstall(nullptr, InstallManifest, InstallDir, FBuildPatchBoolManifestDelegate::CreateRaw(this, &FMobilePatchManager::OnDownloadCompleted)) 호출시에제일첫파라미터로 nullptr 를준곳에저장했던 Manifest 파일을로딩해서그정보를넘겨주면이미받은청크데이터를알수있기때문에받아둔.pak 파일에는없는새로운청크만받아서버전 100 의.pak 을복구하기때문에다운로드사이즈를줄일수있음! 패치시스템정리 APK 를 50MB 이하로만들어서배포 이 APK 는초기패치를받기위한최소한의리소스만포함 RunUAT.bat commadline 을통해서배포해야할.pak 파일을각텍스쳐포맷별로만들어두고, 이때 DLC 기능을이용해서 APK 에포함된컨텐츠제외 BuildPatchTool 을이용해서만들어진.pak 파일을청크단위로쪼개고, 그정보를가진 Manifest 파일생성 웹서버에 Manifest 파일과청크파일을올려두고, 게임에서적절한 Manifest 파일을 HttpRequest 를통해서다운로드받아서준비를해둠 BuildPatchServices 를생성하고거기에청크를받을 URL 세팅과복구될파일경로등을정해두고, 다운로드받은 Manifest 파일을넘겨서다운로드와복구실행 복구가완료되면사용한 Manifest 파일을저장하고, 복구된.pak 파일을찾아서시스템에등록 이제실제게임플레이를시작할타이틀맵을열면끝! 23

감사합니다! Q/A 24