A package names everything once, in its name table, and refers to objects by number: those it takes from other packages through the import table, and those it defines through the export table. The summary gives each table’s count and offset. As on the summary page, this follows the open-source reader UAssetAPI; version numbers below are UE4 object versions unless marked UE5.
Basic types
FString
An int32 length, then the characters including a final zero:
| Length | Characters |
|---|---|
| 0 | None: an empty string with nothing after it |
| Positive n | n bytes, 8-bit text ending with a zero byte |
| Negative −n | n UTF-16 little-endian units (2n bytes), ending with a zero unit |
For example 05 00 00 00 4E 6F 6E 65 00 is None.
FName
Two int32 values, 8 bytes: an index into the name table, then a number. Number 0 means
the name as it is; a number n above 0 means the name followed by
_ and n − 1, so (index of Cube, 3) is
Cube_2.
Package index
An int32 that refers to an object: 0 means none; a positive value i means export i − 1; a negative value i means import −i − 1. So 1 is the first export and −1 the first import.
Name table
NameCount entries at NameOffset. Each is an FString, then,
from version 504 (VER_UE4_NAME_HASHES_SERIALIZED), two uint16 hashes of it:
one that ignores case and one that does not. Readers can ignore the
hashes.
Import table
ImportCount entries at ImportOffset, each an object this
package uses from another package.
| Type | Name | Present when | Meaning |
|---|---|---|---|
| FName | ClassPackage | Always | Package of the object’s class, such as /Script/Engine |
| FName | ClassName | Always | Class, such as StaticMesh or Package |
| int32 | OuterIndex | Always | Package index of the object that contains it; 0 for a package itself |
| FName | ObjectName | Always | The object’s name |
| FName | PackageName | Version ≥ 520, and not PKG_FilterEditorOnly | Package of an import whose package differs from its outer |
| int32 | bImportOptional | UE5 ≥ 1003 | 1 if the import is optional |
Imports form a tree through OuterIndex: a typical texture import is an
object whose outer is an import of class Package naming its package
path.
Export table
ExportCount entries at ExportOffset, each an object this
package defines. Booleans are int32 values, 0 or 1.
| Type | Name | Present when | Meaning |
|---|---|---|---|
| int32 | ClassIndex | Always | Package index of the object’s class |
| int32 | SuperIndex | Always | Package index of the parent struct, for classes and structs |
| int32 | TemplateIndex | Version ≥ 508 | Package index of the object it was made from |
| int32 | OuterIndex | Always | Package index of the containing object; 0 at the top level |
| FName | ObjectName | Always | The object’s name |
| uint32 | ObjectFlags | Always | See object flags |
| int32 or int64 | SerialSize | Always; int64 from version 511 | Size of the object’s data |
| int32 or int64 | SerialOffset | Always; int64 from version 511 | Where the object’s data starts, counted as if the .uexp file continued the .uasset |
| bool | bForcedExport | Always | Forced into this package |
| bool | bNotForClient | Always | Not loaded on clients |
| bool | bNotForServer | Always | Not loaded on servers |
| GUID | PackageGuid | UE5 < 1005 | GUID of a forced export’s original package |
| bool | IsInheritedInstance | UE5 ≥ 1006 | Instance inherited from a parent class |
| uint32 | PackageFlags | Always | Package flags of a forced export’s package |
| bool | bNotAlwaysLoadedForEditorGame | Version ≥ 365 | Not always loaded in editor game mode |
| bool | bIsAsset | Version ≥ 485 | The object is the package’s main asset |
| bool | GeneratePublicHash | UE5 ≥ 1003 | A public hash is generated for it |
| int32 × 5 | Preload dependency offsets and sizes | Version ≥ 507 | First dependency, then the sizes of the four dependency lists (serialise before serialise, create before serialise, serialise before create, create before create) |
| int64 × 2 | Script serialisation start and end | UE5 ≥ 1010, and not PKG_UnversionedProperties | Where the object’s tagged properties start and end within its data |
The object data itself, a list of tagged properties followed by class-specific data, depends on each class and engine version, and is beyond this page.
Dependency table
At DependsOffset, for each export in order: an int32 count, then that many
package indexes the export depends on.
Object flags
| Value | Name |
|---|---|
| 0x00000001 | RF_Public |
| 0x00000002 | RF_Standalone |
| 0x00000004 | RF_MarkAsNative |
| 0x00000008 | RF_Transactional |
| 0x00000010 | RF_ClassDefaultObject |
| 0x00000020 | RF_ArchetypeObject |
| 0x00000040 | RF_Transient |
| 0x00000080 | RF_MarkAsRootSet |
| 0x00000100 | RF_TagGarbageTemp |
| 0x00000200 | RF_NeedInitialization |
| 0x00000400 | RF_NeedLoad |
| 0x00000800 | RF_KeepForCooker |
| 0x00001000 | RF_NeedPostLoad |
| 0x00002000 | RF_NeedPostLoadSubobjects |
| 0x00004000 | RF_NewerVersionExists |
| 0x00008000 | RF_BeginDestroyed |
| 0x00010000 | RF_FinishDestroyed |
| 0x00020000 | RF_BeingRegenerated |
| 0x00040000 | RF_DefaultSubObject |
| 0x00080000 | RF_WasLoaded |
| 0x00100000 | RF_TextExportTransient |
| 0x00200000 | RF_LoadCompleted |
| 0x00400000 | RF_InheritableComponentTemplate |
| 0x00800000 | RF_DuplicateTransient |
| 0x01000000 | RF_StrongRefOnFrame |
| 0x02000000 | RF_NonPIEDuplicateTransient |
| 0x04000000 | RF_Dynamic |
| 0x08000000 | RF_WillBeLoaded |
| 0x10000000 | RF_HasExternalPackage |
Many of these describe an object’s state in memory rather than in a file. Epic gives no public description beyond the names.