기본 콘텐츠로 건너뛰기

[UE] Shipping

    목차

관련 용어


  • (Cook) On the fly : 런타임 실행 시 필요한 에셋(맵, 머티리얼, 텍스처, 사운드 등)을 실시간으로 변환(cook)해서 스트리밍해 주는 방식. 다시말해 서버를 두고, 요청이 들어올 때 필요한 에셋만 변환하여 클라이언트(에디터 또는 실행된 게임)로 전송
    • 개발 중 멀티 디바이스 테스트 시 유용 (예: 모바일/콘솔에서 실행 시 필요한 리소스만 전송).
    • 빠른 반복(iteration) 가능 (전체 패키징 없이 필요한 부분만 즉시 반영).
    • 최적화나 안정성은 일반 Cook/패키징보다 떨어질 수 있음.
    • 개발/테스트 단계에서 주로 사용.
  • By the book : "책에 적힌 대로" 라는 의미대로 엔진이 내부적으로 사용하는 표전적인 쿠킹 절차만 수행.
    • 개발/테스트 단계에서 주로 사용.
    • 빌드 시간이 오래 걸림




프로젝트 패키지, 프로젝트 런처


  • 프로젝트 패키지 : 설정한 플랫폼에 맞는 실제 EXE 파일 생성 (포스트 참조)
  • 프로젝트 런처 : "프로젝트 패키지" 보다 기능이 좀 더 많음. 즉, Platform, Configuration, Target 등 여러 설정을 이용하여 빌드/배포가능 (빌드 파이프라인 관리 도구)


옵션 설명

프로젝트 세팅

패키징

  • Prerequisites (사전적 의미 : 전제 조건)
    • 필수 구성 요소 인스톨러에 포함 : 별다른 서드파티 라이브러리(프로그램)를 추가하지 않았다면, 언리얼 프로그램 실행에는 재배포 패키지만 필요함. 해당 요소를 체크하면 패키징(Shipping)시 재배포 패키지 설치 파일이 포함됨.  





Path 값 출력 테스트

개요

에디터에서 실행할 때와 패키지된 실행파일에서 경로 값이 어떻게 반환 되는지 txt파일로 출력한 후 확인

출력 결과 코드


===Gist code start===


===Gist code end===

추가

Shipping mode에서 위 경로에 파일 생성이 되지 않는 경우. 테스트할 게임을 관리자 권한으로 실행해보거나 "FPlatformProcess::UserDir()" 함수를 이용하여 사용자 경로에 파일 생성을 시도한다.

FPlatformProcess::UserDir() => C:\Users\"사용자 이름?"\Documents\


Open Level 버그

개요

Open Level (by name, by reference)가 에디터에서는 잘 동작하는데 shipping에서는 동작하지 않는 현상이 있어 해결하는 과정을 기록해본다. 엔진 버전은 5.3


시도해본 방법


  • Map 파일 이동
    • Content/Maps 즉, 레퍼런스 경로 /Game/Maps 내부에 맵 파일 이동
  • 에셋 매니저에 맵 : 프로젝트 세팅 → 게임 → 에셋 매니저
    • 기본적으로 "스캔할 프라이머리 에셋 타입" 부분에 "인덱스 [0]" 부분에 "프라이머리 에셋 타입"에는 Map, "에셋 베이스 클래스" 에는 World가 설정되어 있다.
    • "에디터 전용 여부" : 체크 해제
    • "디렉터리" 또는 "특정 에셋" 부분 설정
    • "규칙" → "쿠킹 규칙" : Always Cook 
  • 패키징 설정 : 프로젝트 세팅 → 프로젝트 → 패키징
    • 모두 쿠킹 활성화
      • "프로젝트 콘텐츠 디렉터리의 모든 걸 쿠킹 (아래 맵 목록을 무시)" : 체크 ON
    • 패키지 된 빌드에 맵 목록 추가
      •  "패키지 된 빌드에 포함시킬 맵 목록"
      • "+" 버튼을 눌러 인덱스를 추가한 후, 레퍼런스 경로를 입력
        • 예시 : "/Game/Maps/LevelName" 또는 "LevelName"
    • 쿠킹할 추가 에셋 디렉터리 추가
      • "쿠킹할 추가 에셋 디렉터리" 부분에서 "+"을 누르면 인덱스가 추가된다.
      • 추가된 인덱스의 "..." 버튼을 누르고 맵이 있는 경로를 선택
    • "풀 리빌드" 체크
  • 코드 디버깅 ← 위 방법들로도 안되면 사실상 코드 문제임
    • 에디터 전용 기능을 사용했는지 체크
      • 빌드 때 에디터 기능이 제외되는데, 제외되는 부분이 핵심 부분인지 체크 해봐야됨. 
    • C++ 생성자 부분 체크
      • 에셋을 찾는 함수는 생성자에서는 ConstructHelpers::FObjectFinder 또는 ConstructHelpers::FClassFinder를 사용하고 이외의 영역에서는 LoadObeject를 활용할 것
    • 에디터가 아닌 게임 실행 상태에서 디버깅 방법
      • VS 같은 IDE에서 Configuration을 DebugGame, Target을 Game으로 맞추어 놓고 디버깅 실행
      • "프로젝트 런처"를 이용하여 프로젝트를 실행하며, 이 때 에디터에 나오는 로그를 확인해 보는 방법도 있음.

참고 자료











댓글