UDN
Search public documentation:

UnrealPackagesKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

언리얼 패키지

문서 요약: 언리얼 엔진에 포함된 패키지와 애셋에 대한 개요입니다.

문서 변경내역: Warren Marshall 작성. 홍성진 번역.

개요

언리얼 엔진에서 패키지(Package) 의 개념은 언리얼 엔진을 통해 조작 및 접근할 수 있는 바이너리 데이터 파일 덩어리입니다.

콘텐츠 패키지에는 다양한 유형의 게임 애셋, 이를테면 텍스처, 스태틱 메시, 스켈레탈 메시, 피직스 애셋과 기타 여러가지 애셋들이 들어갑니다. 게임 엔진에 넣을 수 있는 것들은 모두 패키지에 들어간다고 보면 되죠. 언리얼 에디터의 콘텐츠 브라우저 를 통해, 애셋들을 패키지로 임포트하고 이리저리 이동하여 이름을 변경한 다음 결과 패키지를 다시 저장해 낼 수 있습니다.

레벨은 특수 유형 패키지입니다. 일반적으로 레벨에는 애셋이 들어가기 보다는, 패키지 파일 안에 있는 애셋으로의 참조만 들어가게 됩니다. 이를 통해 다수의 레벨에 걸쳐 애셋을 공유하거나, 아티스트가 패키지 파일에 있는 애셋 하나만 수정하는 것으로 모든 레벨에 그것을 참조한 것이 자동 업데이트되게 하는 것도 가능합니다. 애셋을 레벨 파일에 직접 끼워넣는 것도 가능이야 하지만, 일반적으로 그렇게 하면 레벨 파일의 크기가 불어나는 데다 그 애셋을 다른 레벨에서 공유할 수도 없기 때문에 바람직한 일은 아닙니다. 레벨은 UnrealScript 클래스에 정의된 액터를 크게 활용하기도 합니다.

UnrealScript 클래스는 마찬가지로 고유 패키지에 컴파일됩니다. UnrealScript 패키지 역시 콘텐츠와 레벨 패키지로의 참조를 포함할 수 있습니다.

패키지 유형

패키지는 다양한 확장자를 가질 수 있으나 내부적으로는 모두 같은 포맷으로 되어 있습니다. 언리얼 엔진 입장에서 패키지의 내용이 중요하기는 하지만, 이런 확장자는 이렇게 처리해라 특별한 처리 방법을 포함하고 있지는 않습니다. 그러나 대부분의 라이선시께서 따르는 관습은 이렇습니다:

확장자 내용
U 컴파일된 UnrealScript 코드. UCC 컴파일러에 의해 생성된 것으로, 참조 외에 어떤 애셋도 포함하지 않습니다.
UDK 레벨의 기본 확장자. 컴파일된 스크립트 패키지에 정의된 액터와 콘텐츠 패키지에 저장된 애셋을 포함합니다.
UPK 애셋 콜렉션을 나타내는 콘텐츠용 일반 확장자입니다.

라이센시께서는 File Extensions KR 페이지에서 고유 레벨 확장자를 등록할 수 있습니다.

그룹

패키지는 여러 계층의 그룹을 포함할 수 있습니다. 그룹이란 하드 디스크의 디렉토리 구조에서 서브디렉토리로 생각해도 되겠군요. 이는 전적으로 사람이 패키지 내용물을 쉽게 파악하기 위한 용도로 사용되는 것이며, 엔진 입장에서는 사용하든 말든 상관이 없습니다.

언리얼에서의 멀티 레벨 그룹 계층구조는 원하는 만큼 깊이 파고 내려가도 되지만, 일반적으로는 3-4 레벨 정도를 유지하는 것을 추천합니다. 그렇게 하지 않으면 콘텐츠 브라우저의 패키지 트리를 사용하기가 너무 거추장스러워 집니다. 아래는 아머 애셋의 체계를 잡는 데 멀티 레벨 그룹을 사용한 예입니다.

CB_Packages.PNG

이 경우 패키지는 Pickups (하드 드라이브에서는 pickups.upk) 입니다. 패키지 안에는 애셋의 체계를 잡는 데 사용되는 그룹이 다수 있습니다. 예를 들면, 위에서 선택한 아이템의 경우 그 애셋을 구하는 경로는 Pickups.Armor.Materials 가 됩니다. 이는 하드 드라이브에서의 접근법(, 즉 "c:\pickups\armor\materials")과 비슷합니다. 디렉토리가 파일을 품듯, 달이 해를 품듯, 각 그룹 역시 애셋을 품는 것입니다.

이름

애셋과 패키지의 이름은 독특하게 지을 것을 강력 추천합니다. 여러 곤데 같은 이름을 사용하면 로드/참조하려는 것이 정확히 무엇인지, 엔진이 파악하기가 힘들어져 잘못된 것을 찾게 되는 결과를 낼 수 있습니다. 이런 젼차로 문제 해결이 어려워지고, 디버깅을 하느라 악몽같은 밤을 지새게 되겠지요.

이런 문제를 애초에 막는 것은, 애셋/패키지 이름을 독특하게 짓는 것 뿐입니다. 그렇다고는 해도 그룹 이름은 마음대로 지으셔도 됩니다. 그룹을 참조한다던가 직접 검색할 일은 없기 때문입니다.

체계

콘텐츠 패키지는 일반적으로 빌드의 Content 디렉토리에 보관됩니다. 텍스처같은 여러가지 콘텐츠 유형을 나타내는 서브디렉토리가 있을 수도 있구요. 다시 강조하건데, 이건 순전히 사람이 파악하고 관리하기 좋으라고 하는 용도일 뿐입니다.

레벨 패키지는 빌드의 Maps 디렉토리에 보관됩니다.

컴파일된 UnrealScript 패키지는 빌드의 Scripts 디렉토리에 보관됩니다.

패키지 이름과 체계 관련 상세 정보는 Asset Pipeline KR 페이지를 참고하시기 바랍니다.

제한

패키지 파일에 표시되는 최대 애셋의 갯수에는 제한이 없으나, 전체 패키지 크기에는 2GB 제한이 있습니다. 그 이상 넘어가면 어떤 플랫폼에서는 패키지가 로드되지 않을 수도 있습니다. 패키지 크기가 그 절반 정도에라도 가까워지는 날에는, 여러 부분을 작은 패키지로 추상화시켜 떼어내는 것이 바람직합니다.

관리

그밖에도 여러 팀 멤버들이 작업 중인 패키지에는 다양한 유형의 콘텐츠가 포함되어 크기가 커질 수 있습니다. 이때문에 소스 콘트롤의 각 리비전에 매우 큰 파일 사본이 저장될 수 있구요. 이런 문제를 피하기 위해 갖고있는 패키지 세트 중 200-300 메가가 넘는 것을 탐색하는 전략을 생각해 봅시다. 그렇게 커다란 패키지를 잡아다가 쪼개 주면 디스크 사용량 면에서 큰 도움이 될 수 있습니다.

쿠킹은 필요한 데이터 전부를 시크-프리(seek-free) 패키지로 "합치는" 작업을 많이 합니다. 게다가 개발 주기 상의 후반부, 콘텐츠 반복작업이 덜해지는 시점에 패키지를 커다란 덩어리로 다시 합치는 것도 꽤나 쉽습니다. 그 방법은, 한 패키지의 애셋 이름을 다른 것으로 바꾸기만 하면 됩니다. 그러면 새 위치를 가리키는 Redirector 오브젝트가 생성됩니다. FixupRedirects 커맨드렛 을 사용하여 예전 콘텐츠 위치로의 참조 전부가 새 위치를 가리키도록 리매핑하기 전까지는 예전(빈) 패키지를 지워서는 안됩니다.

로딩

패키지에 정의된 데이터 중 (defaultproperties 를 통해) 네이티브 C++ 클래스에 영향을 끼치는 데이터가 코드 실행시 사용될 수 있도록 하기 위해, 네이티브 패키지를 로드합니다. C++ 과 스크립트에 정의된 클래스는 항상 동기 상태여야 합니다.

패키지 로딩은 매우 복잡한 시스템으로, 대부분의 라이선시께서는 로우 레벨에서 벌어지는 일에 실제로 관여할 일이 절대 없습니다.

Exports 는 패키지에 존재하는 오브젝트입니다.

Imports 는 다른 패키지에 있는 오브젝트로의 참조입니다.

즉 A 패키지의 머티리얼 MatX 가 A 패키지의 TexY 와 B 패키지의 TexZ 를 참조한다면 이렇게 됩니다:

Package A:
        Exports:
                MatX
                TexY
        Imports:
                B.TexZ

Package B:
        Exports:
                TexZ

에디터는 네이티브 스크립트 패키지, EditPackages 에 나열된 패키지, 환경설정 파일의 PackagesToBeFullyLoadedAtStartup 키, 그 모든 참조를 로드합니다.

(에디터나 게임) 패키지를 로드하면, 다른 패키지의 오브젝트를 로드하여 모든 참조를 해결합니다. 참조된 패키지의 모든 오브젝트를 로드하는 것은 아니며, 딱 필요한 만큼만 로드합니다.

에디터의 콘텐츠 브라우저 에 회색으로 표시된 패키지는, 다른 패키지를 로드한 결과에 따라 일부만 로드된 것으로, 그 패키지 위에 우클릭하여 전체 로드시킬 수 있습니다. 에디터를 시작할 때마다 게임의 Content 디렉토리를 검색하여 패키지를 자동으로 찾아냅니다. 찾아낸 패키지는 콘텐츠 브라우저 의 패키지 트리에 모두 나타나게 됩니다.

콘텐츠 브라우저 의 왼쪽 아래에 있는 폴더 아이콘을 클릭하면 외부 (엔진의 검색 경로 내에서 발견되지 않은) 패키지도 로드할 수 있습니다. 그렇지만 레벨이나 다른 패키지에서 외부 패키지의 애셋을 참조하면 게임이나 커맨드렛 실행시 찾지 못하게 될 것이니, 그러지 않는 것이 좋습니다.