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

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

PowerPoint Presentation

Secure Programming Lecture1 : Introduction

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

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

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

SBR-100S User Manual

Facebook API

PowerPoint 프레젠테이션

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

슬라이드 1

슬라이드 1

임베디드시스템설계강의자료 4 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

슬라이드 1

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

4S 1차년도 평가 발표자료

PowerPoint 프레젠테이션

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

PowerPoint 프레젠테이션

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

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

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

Windows 8에서 BioStar 1 설치하기

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

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

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

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

슬라이드 1

UI TASK & KEY EVENT

임베디드디바이스개발시커널로리눅스를많이사용하는데, 그때그커널과함께리눅스명령어도필요하게된다. 모든명령어를지원하기위해서는다수의개별적인패키지들이필요하다. 한프로젝트에서그많은명령어를한번에지원해준다면자원제약적인임베디드환경에서공간효율성이극대화될것이다. 상대적으로경량화된리눅스명령어세

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

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

( )부록

Windows 10 General Announcement v1.0-KO

gcloud storage 사용자가이드 1 / 17

Microsoft PowerPoint - [Practice #1] APM InstalI.ppt

Android Master Key Vulnerability

스마트월드캠퍼스 교육교제

(Microsoft PowerPoint - AndroG3\306\367\306\303\(ICB\).pptx)

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

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

6. 설치가시작되는동안 USB 드라이버가자동으로로드됩니다. USB 드라이버가성공적으로로드되면 Setup is starting( 설치가시작되는중 )... 화면이표시됩니다. 7. 화면지침에따라 Windows 7 설치를완료합니다. 방법 2: 수정된 Windows 7 ISO

ICT03_UX Guide DIP 1605

02_3 지리산권 스마트폰 기반 3D 지도서비스_과업지시서.hwp

Spring Boot

untitled

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

윈도 모바일 6.1을 OS로 사용하는 스마트폰(옴니아2 등)에서의 Tcl/Tk의 사용

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

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

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

문서의 제목 나눔고딕B, 54pt

PowerPoint 프레젠테이션

JDK이클립스

JUNIT 실습및발표

C# Programming Guide - Types

해외전자정보서비스이용교육 EBSCO ebooks - 인터페이스상세이용방법및다운로드 ( 대출모드 ) 안내

표준프레임워크 Nexus 및 CI 환경구축가이드 Version 3.8 Page 1

PowerPoint 프레젠테이션

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

Apache Ivy

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

ISP and CodeVisionAVR C Compiler.hwp

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

서현수

3D MAX + WEEK 9 Hansung Univ. Interior Design

디지털 공학

슬라이드 1

Spring Boot/JDBC JdbcTemplate/CRUD 예제

슬라이드 1

DocsPin_Korean.pages

슬라이드 1

< 목차 > Ⅰ. 개요 3 Ⅱ. 실시간스팸차단리스트 (RBL) ( 간편설정 ) 4 1. 메일서버 (Exchange Server 2007) 설정변경 4 2. 스팸차단테스트 10

Cubase AI installation guide

Adobe Flash 취약점 분석 (CVE )

Interstage5 SOAP서비스 설정 가이드

소프트웨어설치 1. 소프트웨어설치및제거 ( 소스코드 ) 소스코드컴파일을이용한 S/W 설치 1. 소스코드다운로드 - 예 ) httpd tar.gz - 압축해제 : #tar xzvf httpd tar.gz - INSTALL 또는 README파일참조

<C5EBB1C73339C8A BFF9C8A329B9AEC8ADBFCD20B1E2BCFAC0C720B8B8B3B22E687770>

슬라이드 1

Google Maps Android API v2

ios 의경우 Unity 버전 4.X 의경우, EasyMovieTexture 폴더안에 Unity463_Patch_IOS 가있습니다. 버전에 맞게패치해주세요. 디버그모드사용시아래와같이사용하세요.

PowerPoint 프레젠테이션

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

Microsoft PowerPoint - 07-Data Manipulation.pptx

슬라이드 1

슬라이드 1

Cisco FirePOWER 호환성 가이드

Microsoft PowerPoint App Fundamentals[Part1].pptx

슬라이드 1

mobile_guide_SA

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

슬라이드 1

소프트웨어 검증 및 설계

tut_modelsim(student).hwp

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

PowerPoint 프레젠테이션

슬라이드 1

메일서버등록제(SPF) 인증기능적용안내서 (Exchange Windows 2000) OS Mail Server SPF 적용모듈 작성기준 Windows Server 2000 Exchange Server 2003 GFI MailEssentials 14 for

Transcription:

UE4 모바일게임출시를위해궁금하실바로그것들! 신광섭 Developer Relations Lead/Programmer Epic Games Korea 목차 왜이컨텐츠가쿠킹되고포함되지? 앱사이즈줄여보기 4.11 기준으로다시살펴보는패치시스템 알아두면유용한소소한팁들 1

왜이컨텐츠가쿠킹되고포함되지? 앱사이즈줄여보기 패키지크기줄이기 패키지크기줄이기 문서로시작하세요. https://docs.unrealengine.com/latest/kor/engine/performance/reducingpackag esize/index.html 프로젝트세팅 에 패키징 항목에 Create compressed cooked packages 옵션을통해서쿠킹컨텐츠압축하기 2

패키지크기줄이기 사용하지않은플러그인제거 Paper2D SpeedTree Importer Script Generator Plugin UObject Example Plugin ArchVis Character ChracterAI Leap Motion Controller Plugin Epic Survey Experimental HTML5 Networking Plugin Cable Component Custom Mesh Component Procedural Mesh Compnent Gear VR Oculus Input Oculus Library Oculus Rift Steam VR 패키지크기줄이기 사용하지않는모듈제거 일부모듈들을빌드에서뺄수있는옵션있음 Unreal Match 3 예제로참고가능 IOSEngine.ini 에 [/Script/BuildSettings.BuildSettings] bcompileapex=false bcompilebox2d=false bcompileicu=true bcompilesimplygon=false bcompileleanandmeanue=true bincludeado=true bcompilerecast=true bcompilespeedtree=false bcompilephysxvehicle=false bcompilefreetype=true bcompileforsize=false bcompilecef3=false 3

패키지크기줄이기 패키지블랙리스트 플랫폼별로포함하지않을어셋 / 폴더설정가능 기본으로포함되는원치않는 / 필요하지않은리소스들제거 4.11 에서는이와관련한편리한옵션추가됨 문서에추가적으로아래항목들도제거가능../../../Engine/Content/EditorBlueprintResources/../../../Engine/Content/EditorLandscapeResources/../../../Engine/Content/EditorMaterials/../../../Engine/Content/EngineDebugMaterials/../../../Engine/Content/EngineMaterials/AntiAliasedTextMaterialTranslucent.uasset../../../Engine/Content/Tutorial/../../../Engine/Content/EditorMeshes/ 패키지크기줄이기 최대다이내믹포인트라이트개수 Used Shared Dynamic Point Light Shaders 가 true 일경우는 Max Dynamic Point Lights 가큰의미가없음 퍼포먼스를위해서변수를 false 로두면큰의미가 전체쉐이더개수에따라최종패키지사이즈차이가크게날수있으니최소한으로하시는것을적극추천 4

패키지크기줄이기 원하지않는컨텐츠가쿠킹되어서포함된다? 기본으로참조 / 포함되는컨텐츠들이있음 Slate 를고려한기본으로추가되는컨텐츠폴더들 BaseEditor.ini 에 [UI] +ContentDirectories=/Game/UI +ContentDirectories=/Game/Widget +ContentDirectories=/Game/Widgets +ContentDirectories=/Engine/MobileResources 패키지크기줄이기 기본으로쿠킹되서포함되는맵과게임오브젝트확인 프로젝트세팅 에 맵 & 모드 에설정된값들 5

패키지크기줄이기 이런과정들만거쳐도 OBB 사이즈가 43.1 MB -> 13.4 MB 여기서조금더하드코어하게줄여본다면? 출시버전에엔진디폴트어셋들교체도고려가능 조금더패키지크기줄이기 출시버전에엔진디폴트어셋들교체하기 엔진에서기본적으로사용할수있는기본어셋들이존재 BaseEngine.ini 에설정되어있음 void UEngine::InitializeObjectReferences() 에서로딩해서세팅을함 줄여볼수있는것은? 내부적으로게임에서사용하는폰트가있을테니 TinyFontName=/Engine/EngineFonts/RobotoTiny.RobotoTiny SmallFontName=/Engine/EngineFonts/Roboto.Roboto MediumFontName=/Engine/EngineFonts/Roboto.Roboto LargeFontName=/Engine/EngineFonts/Roboto.Roboto SubtitleFontName=/Engine/EngineFonts/Roboto.Roboto 6

조금더패키지크기줄이기 출시버전에엔진디폴트어셋들교체하기 모든머티리얼이제대로세팅되어있다면 DefaultMaterialName=/Engine/EngineMaterials/WorldGridMaterial.WorldGridM aterial 변경도고려가능 특별한 material 로 busedasspecialenginematerial 가 true 로되어있어서모든 primitive type 에대한쉐이더를전부가지고있기때문에크다 쿠킹하면 3.62MB 정도 4.11 기준으로다시살펴보면패치시스템 7

모바일게임앱출시 - 컨텐츠 3D 게임은일반적으로컨텐츠가많고, 크기때문에구글의최대 APK 사이즈안에다넣기는사실불가능 작년 9 월쯤구글이 APK 최대사이즈 100 MB 로상향! ios 는사실제한이없지만 Wifi 없이다운로드가능하려면 100 MB 밑으로해야함 100MB 이상의앱을위해구글에서는 OBB 파일지원 UE4 도기본으로안드로이드패키징시에모든게임컨텐츠는 OBB 로빼서자동으로만들어줌 하지만한국의모바일게임은빠른컨텐츠업데이트가필요한사실상온라인게임처럼운영하기에플랫폼지원시스템을쓰기는어려움 그래서개별컨텐츠서버를두고, 서비스중 컨텐츠서버사용한 UE4 모바일게임 초기 IPA/APK 만들기 게임에서사용하는컨텐츠들이포함된 Pak 파일만들기 만들어진컨텐츠파일을다운로드에용의하도록나누기 다운로드를위해서나누어진파일을다운로드하고복구하기 8

기본배포버전만들기 UE4 의컨텐츠다운로드시스템은 UE4 네이티브엔진레벨에서동작 즉, 엔진이구동되어야다운로드기능사용가능 엔진구동을위한최소컨텐츠 + 다운로드관련정보를보여줄최소컨텐츠필요 기본배포버전만들기 - 안드로이드 배포를위한최소한의컨텐츠들만포함한 APK 를만드는것필요 1. 컨텐츠다운로드를위한기본맵만들기 컨텐츠다운로드에대한메시지보여주는 UMG 맵블루프린트에서는그 UMG 를생성해서추가만 9

기본배포버전만들기 - 안드로이드 2. OBB 파일을따로만들지않고, APK 에포함하기 3. 컨텐츠다운로드맵과기본컨텐츠만쿠킹해서포함한 APK 만들기 RunUAT.bat 배치파일을이용해서한번에쿠킹에서 APK 까지만들면편함 C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=android_etc1 -targetplatform=android -cookflavor=etc1 -cook -map=patch -stage -package -cmdline=patch -compressed -pak -build 기본배포버전만들기 - IOS 1. IOS 의경우 IPA 에기본으로컨텐츠들포함해서만들기때문에컨텐츠다운로드용기본맵만쿠킹패키징하면됨예 ) C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=ios -targetplatform=ios -cook -map=patch -stage -package -cmdline=patch -compressed -pak -build 10

다운로드컨텐츠만들기 - 안드로이드 1. 기본배포버전에포함된컨텐츠를제외한다운로드컨텐츠만들기필요 - DLC 기능사용 DLC 기능? 배포버전설정해서쿠킹하면거기서쿠킹된컨텐츠들을기억해두고, DLC 쿠킹시에설정했던배포버전을사용해서쿠킹하면배포버전에서쿠킹된컨텐츠들은제외되는기능 다운로드컨텐츠만들기 - 안드로이드 2. 베이스버전쿠킹하기예 ) C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=android_etc1 -targetplatform=android -cookflavor=etc1 -cook -map=patch -cmdline=patch -build -unversionedcookedcontent -createreleaseversion=releasecontent 쿠킹이완료되면게임프로젝트폴더 \Releases\ReleaseContent\Android_ETC1 폴더안에쿠킹된정보를기억해둔 AssetRegistry.bin 생성됨 11

다운로드컨텐츠만들기 - 안드로이드 3. 다운로드컨텐츠만들기 배포버전을제외한실제게임에필요한컨텐츠들을모두포함한다운로드컨텐츠제작필요예 ) C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=android_etc1 -targetplatform=android -cookflavor=etc1 -build -cook -map=gamelevel+main -unversionedcookedcontent -BasedOnReleaseVersion=ReleaseContent -DLCName=DownloadContent -stage -compressed -pak -cmdline=main Map 부분에포함되어야하는모든맵을넣여야하는데맵이추가될때마다 comandline 에추가하는것은좋지못함 다운로드컨텐츠만들기 - 안드로이드 3. 다운로드컨텐츠만들기 ( 계속 ) -MAPINISECTION= 파라미터를사용하면좀더편함예 ) C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=android_etc1 -targetplatform=android -cookflavor=etc1 -build cook -MAPINISECTION=DownloadContent -unversionedcookedcontent -BasedOnReleaseVersion=ReleaseContent -DLCName=DownloadContent -stage -compressed -pak -cmdline=main DefaultEditor.ini 에 [DownloadConent] +Map=Main +Map=GameLevel 이렇게설정하면 DownloadConent 에설정됨맵들을전부쿠킹 12

다운로드컨텐츠만들기 - 안드로이드 3. 다운로드컨텐츠만들기 ( 계속 ) 이렇게쿠킹이완료되면배포해야하는컨텐츠들이전부포함됨하나의큰 Pak 파일이생성됨 예 ) Match3\Plugins\DownloadContent\Saved\StagedBuilds\Android_ETC 1\UnrealMatch3\Content\Paks\UnrealMatch3-Android_ETC1.pak 다운로드컨텐츠만들기 - IOS 1. 베이스버전쿠킹하기예 ) C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=ios -targetplatform=ios -cook -map=patch -cmdline=patch -build -unversionedcookedcontent -createreleaseversion=releasecontent 2. 다운로드컨텐츠만들기예 ) C:\Program Files\Unreal Engine\4.11\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun -project= D:\UnrealProjects\Match3\Match3.uproject" -clientconfig=development -platform=ios -targetplatform=ios -build cook -MAPINISECTION=DownloadContent -unversionedcookedcontent -BasedOnReleaseVersion=ReleaseContent -DLCName=DownloadContent -stage -compressed -pak -cmdline=main 13

다운로드컨텐츠만들기 이제안드로이드 /IOS 별로만들어진 Pak 파일을 UE4 컨텐츠배포시스템에서사용할수있도록작업필요 사용되는툴과모듈은 BuildPatchTool 과 BuildPatchServices BuildPatchTool 파일을다운로드에편하도록청크로나누어주고, 복구를위한 manifest 파일을만드는툴 BuildPatchServices BuildPatchTool 로만들어진 manifest 를이용해서청크들을다운로드하고, 원본파일을복구해주시는모듈 다운로드컨텐츠만들기 BuildPatchTool 사용법 위치 Engine\Binaries\Win64\BuildPatchTool.exe 예 ) Engine\Binaries\Win64\BuildPatchTool.exe -BuildRoot= D:\UnrealProjects\Match3 \Plugins\DownloadContent\Saved\StagedBuilds\Android_ETC1" -CloudDir= D:\Unr ealprojects\match3\clouddir" -AppID=0 -AppName= MatchGame" -BuildVersion= M atchgame-1" -AppLaunch=".\Engine\Binaries\Win64\UE4Editor.exe" -AppArgs="" -c ustomint="chunkid=1 BuildVersion 을비교해서새로운컨텐츠인지비교하기때문에 BuildVersion 은중요 생성되는것은 14

컨텐츠다운로드하기 BuildPatchServices 사용법 안드로이드환경 사용을위해필요한작업들살펴보면 1. BuildPatchTool로만들어진 manifest 파일과청크폴더를웹호스팅서버에올 려둔다. 2. BuildPatchServices에서사용하기위해 Manifest 파일을다운로드한다. 3. BuildPatchServices에청크폴더를다운로드할웹서버주소를세팅 4. 다운로드된청크및임시파일을저장할폴더와복구된원본파일이놓여질 경로를 BuildPatchServices에세팅 5. BuildPatchServices에다운로드요청 컨텐츠다운로드하기 BuildPatchServices 에서사용하기위해 Manifest 파일을다운로드한다. HTTP 모듈을사용해서 Manifest 파일다운로드필요 단, 추후에컨텐츠가변경되어패치가있을수도있고, 그렇게되면다운로드받아야하는 manifest 파일의이름이변경될수있음 그래서간단한 manifest 파일정보를가지고있는파일을올리거나알맞은 manifest 파일을리턴해주는웹프로그램필요 15

컨텐츠다운로드하기 예 ) manifest 파일정보를가지고있는간단한 json 파일을사용한다면? 그럼실제 BuildPatchServices 을사용하기위해서 Build.cs 에필요한모듈들은 PublicDependencyModuleNames.AddRange( new string[] "HTTP", "Json", "OnlineSubsystem", "BuildPatchServices", "PakFile", ); 컨텐츠다운로드하기 예 ) manifest 파일정보를가지고있는간단한 json 파일을사용한다면? ( 계속 ) TSharedRef<class IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest(); HttpRequest->OnProcessRequestComplete().BindRaw(this, &FPatchManager::GetManifestFileU RL_HttpRequestComplete); HttpRequest->SetURL(TEXT(http://patch.myserver.com/downloadcontent.json)); HttpRequest->SetVerb(TEXT("GET")); HttpRequest->ProcessRequest(); 16

컨텐츠다운로드하기 예 ) manifest 파일정보를가지고있는간단한 json 파일을사용한다면?( 계속 ) downloadcontent.json 는아주단순하게 manifest": http://patch.myserver.com/matchgamematchgame-1.manifest" 컨텐츠다운로드하기 예 ) manifest 파일정보를가지고있는간단한 json 파일을사용한다면?( 계속 ) FPatchManager::GetManifestFileURL_HttpRequestComplete (FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bsucceeded) 함수에서는 ResponseStr = HttpResponse->GetContentAsString(); if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode())) TSharedPtr<FJsonObject> JSONManifestObject; TSharedRef<TJsonReader<TCHAR>> Reader = TJsonReaderFactory<TCHAR>::Create(ResponseStr); // Attempt to deserialize JSON if (FJsonSerializer::Deserialize(Reader, JSONManifestObject)!JSONManifestObject.IsValid()) 17

컨텐츠다운로드하기 // Attempt to deserialize JSON if (FJsonSerializer::Deserialize(Reader, JSONManifestObject)!JSONManifestObject.IsValid()) // Get the values map TMap<FString, TSharedPtr<FJsonValue>>& JsonValueMap = JSONManifestObject->Values; TSharedPtr< FJsonValue > JsonAppNameString = JsonValueMap.FindRef(TEXT("manifest")); if (JsonAppNameString.IsValid()) FString ManifestFile = JsonAppNameString->AsString(); // Create the Http request and add to pending request list TSharedRef<class IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest(); HttpRequest->OnProcessRequestComplete().BindRaw(this, &FPatchManager::CompareManifestFiles_HttpRequestC omplete); HttpRequest->SetURL(ManifestFile); HttpRequest->SetVerb(TEXT("GET")); HttpRequest->ProcessRequest(); 컨텐츠다운로드하기 CompareManifestFiles_HttpRequestComplete 함수에서는 IBuildPatchServicesModule* BuildPatchServices = &FModuleManager::LoadModuleChecked<IBuildPatchServicesModule>(TEXT("BuildPatchServices")); if (bsucceeded && HttpResponse.IsValid()) ResponseStr = HttpResponse->GetContentAsString(); if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode())) InstallManifest = BuildPatchServices->MakeManifestFromJSON(ResponseStr); FString DownloadedManifestFileName = FPaths::Combine(*GExternalFilePath, TEXT("Patches"), TEXT("DownloadedManifest.manifest")); CurrentManifest = BuildPatchServices- >LoadManifestFromFile(DownloadedManifestFileName); if (!CurrentManifest.IsValid() (InstallManifest->GetVersionString()!= CurrentManifest- >GetVersionString())) // download new content 18

컨텐츠다운로드하기 // download new content IBuildPatchServicesModule* BuildPatchServices = &FModuleManager::LoadModuleChecked<IBuildPatchServicesModule>(TEXT("BuildPatchServices")); IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); StageDir = FPaths::Combine(*GExternalFilePath, TEXT("Patches"), TEXT("Staged")); InstallDir = FPaths::Combine(*GExternalFilePath, TEXT("Patches"), TEXT("Installed")); BuildPatchServices->SetCloudDirectory(CloudURL); BuildPatchServices->SetStagingDirectory(StageDir); if (CurrentManifest.IsValid()) BuildInstaller = BuildPatchServices->StartBuildInstall(CurrentManifest, InstallManifest, InstallDir, FBuildPatchBoolManifestDelegate::CreateRaw(this, &FPatchManager::OnDownloadCompleted)); else BuildInstaller = BuildPatchServices->StartBuildInstall(nullptr, InstallManifest, InstallDir, FBuildPatchBoolManifestDelegate::CreateRaw(this, &FPatchManager::OnDownloadCompleted)); 컨텐츠다운로드하기 void FPatchManager::OnDownloadCompleted(bool bsuccess, IBuildManifestRef Manifest) FString DownloadedManifestFileName = FPaths::Combine(*GExternalFilePath, TEXT("Patches"), TEXT("DownloadedManifest.manifest")); BuildPatchServices->SaveManifestToFile(DownloadedManifestFileName, Manifest); // Pak 파일찾기 // Pak 파일찾고, Mount 하기 19

컨텐츠다운로드하기 void FPatchManager::OnDownloadCompleted(bool bsuccess, IBuildManifestRef Manifest) // Pak 파일찾기 class FPakSearchVisitor : public IPlatformFile::FDirectoryVisitor TArray<FString>& FoundPakFiles; public: FPakSearchVisitor(TArray<FString>& InFoundPakFiles) : FoundPakFiles(InFoundPakFiles) virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bisdirectory) if (bisdirectory == false) FString Filename(FilenameOrDirectory); if (FPaths::GetExtension(Filename) == TEXT("pak")) FoundPakFiles.Add(Filename); // Add Filename to Manifest IFileManager::Get().SetTimeStamp(*Filename, FDateTime::UtcNow()); return true; ; 컨텐츠다운로드하기 void FPatchManager::OnDownloadCompleted(bool bsuccess, IBuildManifestRef Manifest) // Pak 파일찾고, Mount 하기 TArray<FString> FoundPaks; IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); FPakSearchVisitor Visitor(FoundPaks); PlatformFile.IterateDirectoryRecursively(*InstallDir, Visitor); for (const auto& PakPath : FoundPaks) FPakPlatformFile* PakPlatformFile = static_cast<fpakplatformfile*>(fplatformfilemanager::get().findplatformfile(text("pakfile"))); PakPlatformFile->Mount(*PakPath, 1, TEXT("../../../Match3/")); // 메인게임레벨로딩 20

패치시스템정리 최소한의컨텐츠다운로드를위한배포용 APK/IPA 만들기 실제게임컨텐츠를모두포함한 pak 파일만들기 DLC 기능사용으로초기배포컨텐츠제거해서생성 BuildPatchTool 을사용해서 pak 파일을다운로드할수있게가공 BuildPatchServices 를사용해서 BuildPatchTool 로만들어진 manifest 와청크파일다운로드하고, pak 파일복구해서 mount! 패치시스템정리 생각해볼이슈들 4.11 전의엔진버전사용하시는경우같은리소스재쿠킹시에쿠킹된컨텐츠바이너리가매번바뀌는이슈가많을수있음 4.11 업데이트추천드리고, 경우에따라서는어셋다시저장해야해결됨 Compressed 옵션으로 Pak 파일을압축할경우실제어셋이많이바뀌지않았어도만들어진 Pak 파일은전에 Pak 많은바이너리차이가날수있고, 이로인해다운로드받는청크가많아질수있음 Pak 파일을여러개로나누어만들어서다운로드받고, Mount 를여러개하는것도현재로서는이이슈를우회할방법 내부적으로개선할수있는점이있을지고민중 마지막으로, 설명드린초기배포버전과다운로드컨텐츠제작법을 GUI 기반으로쉽게할수있는기능개발예정! 21

알아두면유용한소소한팁들 Android 6.0 runtime permission 처리예제 안드로이드에서 Target SDK 를 23(6.0) 으로할경우 runtime permission 사용이필요 UE4 에지원추가방법은? 1. Engine\Build\Android\Java\src\com\epicgames\ue4\ GameActivity.java 에 runtime permission 관련처리추가필요 http://stackoverflow.com/questions/36098366/android-marshmallowpermissions/36098423#36098423 참조 첨부된 GameActivity.java.txt 파일참조. 2. Engine\Build\Android\Java\src\com\google\android\vending\expansion\downloader\impl\DownloadNotific ation.java 수정필요 현재구글에서제공한 APK Expansion Zip Library 를사용하고있는데아직 6.0 호환버전을지원하고있지않음 그래서어차피컨테츠다운로드를사용하는거면 setlatesteventinfo 를코멘트처리해서임시로우회 3. 최신 android.support.v4 로교체 C:\NVPACK\android-sdk-windows\SDK Manager.exe 실행후에 Extras 항목에 Android Support Library 를최신버전받기 C:\NVPACK\android-sdk-windows\extras\android\support\v4\android-support-v4.jar 파일을 Engine/Build/Android/Java/libs/android-support-v4.jar 덮어쓰기 4. 안드로이드 6.0 은 org.apache.http 가제거되었기에따로추가필요 C:\NVPACK\android-sdk-windows\platforms\android-23\optional\org.apache.http.legacy.jar 을 Engine/Build/Android/Java/libs/org.apache.http.legacy.jar 복사추가 22

안드로이드비디오녹화 디버깅이나기타목적을위해서안드로이드화면을녹화가능 PC 에디바이스연결후콘솔창에아래명령어입력 adb shell screenrecord /sdcard/ 파일이름.mp4 --bit-rate 8000000 디바이스에서벌어지는내용을 180 초까지녹화할수있음 언제든지콘솔창에서 Ctrl + C 를누르면비디오녹화중지됨 비디오는일반적으로폰의루트디렉토리에서찾을수있음 감사합니다! Q/A Q: 다운로드시스템을썼을때스트리밍레벨의경우제대로로딩이안된다. 테스트해본결과스트리밍레벨도로딩이잘되는것으로확인이됩니다. 대신에 Engine 에있는컨텐츠를사용할경우이컨텐츠들은현재추천드린방식의다운로드받아서프로젝트경로로 Mount 하는경우에는포함이되지않기때문에그리소스들이나오지않아서제대로로딩이안된다고보일수있을것같습니다.( 예를들어대표적인것이 /Engine/EngineSky/BP_Sky_Sphere.uasset) 그래서그런컨텐츠들을복사해서게임의컨텐츠폴더에옮겨서사용하시면될것같습니다. Q: 4.10 에서는패치관련한실행파일이나모듈이 (BuildPatchTool.exe 와 BuildPatchServices 모듈 ) 런쳐버전에는없다. 네. 4.10 에런쳐버전에서느는해당툴이나모듈이없습니다. 그래서 github 에서풀소스코드다운로드후에빌드해서만드셔야하는데요. 대신에 4.11 에는런쳐버전에도포함이되어있고, 컨텐츠다시쿠킹시에변경되지않은컨텐츠가변경되는이슈들이많이해결되었으므로 4.11 로업그레이드해서사용하시기를추천드립니다. 23