UE4运行时加载pak文件

首先需要在**本项目**中cook内容,内容放在content文件夹下,cooked文件在[ProjectName]\Saved\Cooked\WindowsNoEditor\[ProjectName]\Content\[CookedFolder]

然后用引擎自带的unrealpak打包成一个pak文件 unrealpak D:\MyDesktop\Apple.pak -create=[ProjectName]\Saved\Cooked\WindowsNoEditor\[ProjectName]\Content\[CookedFolder] -compressed

最后在运行时加载:

void AMyActor::BeginPlay()
{
    Super::BeginPlay();

    OldPlatform = MakeShareable(&FPlatformFileManager::Get().GetPlatformFile());
    PakPlatformFile = MakeShareable(new FPakPlatformFile());
    PakPlatformFile->Initialize(OldPlatform.Get(), TEXT(""));

    TestLoadPak(TEXT("D:\\MyDesktop\\Apple.pak"));
}

void AMyActor::TestLoadPak(FString InFullPath)
{
    FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);

    FString PakFileFullPath = InFullPath;

    FPakFile* TmpPak = new FPakFile(PakPlatformFile.Get(), *PakFileFullPath, false);
    FString PakMountPoint = TmpPak->GetMountPoint();
    int32 Pos = PakMountPoint.Find("Content/");
    FString NewMountPoint = PakMountPoint.RightChop(Pos);
    NewMountPoint = FPaths::ProjectDir() + NewMountPoint;
    //FString NewMountPoint = "../../../DBJTest/Content/DLC/";

    TmpPak->SetMountPoint(*NewMountPoint);

    if (PakPlatformFile->Mount(*PakFileFullPath, 1, *NewMountPoint))
    {
        TArray<FString> FoundFilenames;
        TmpPak->FindPrunedFilesAtPath(FoundFilenames, *TmpPak->GetMountPoint(), true, false, false);

        if (FoundFilenames.Num() > 0)
        {
            for (FString& Filename : FoundFilenames)
            {
                if (Filename.EndsWith(TEXT(".uasset")))
                {
                    FString NewFileName = Filename;
                    NewFileName.RemoveFromEnd(TEXT(".uasset"));
                    int32 Pos2 = NewFileName.Find("/Content/");
                    NewFileName = NewFileName.RightChop(Pos2 + 8);
                    NewFileName = "/Game" + NewFileName;

                    UObject* LoadedObj = StaticLoadObject(UObject::StaticClass(), NULL, *NewFileName);

                    UStaticMesh* SM = Cast<UStaticMesh>(LoadedObj);
                    if (SM)
                    {
                        GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT("Get static mesh"));
                        AStaticMeshActor* MeshActor = GetWorld()->SpawnActor<AStaticMeshActor>(AStaticMeshActor::StaticClass(), FVector(0, 0, 460), FRotator(0, 0, 0));
                        MeshActor->SetMobility(EComponentMobility::Movable);
                        MeshActor->GetStaticMeshComponent()->SetStaticMesh(SM);
                        break;
                    }
                }
            }
        }
    }

    FPlatformFileManager::Get().SetPlatformFile(*OldPlatform);
}

C 加载pak文件是指在计算机中加载、读取和使用pak文件pak文件是一种资源文件格式常用于存储游戏或软件中的各种素材(如图片、音频、视频等)和配置文件加载pak文件首先需要通过程序代码找到pak文件的路径,并创建一个合适的数据结构来存储pak文件的内容。接着,需要使用相应的文件读取函数来读取pak文件,并将其内容解析存储到内存中。 一般情况下,pak文件内部会使用目录结构来组织其中的资源文件。所以,在加载pak文件时,还需要对其内部的目录结构进行解析,并根据需要进行索引和查找。这通常包括读取pak文件中的目录索引表或相应的配置文件。有了正确的索引,程序就能够快速地找到所需的资源文件并进行加载和使用。 加载pak文件主要有以下几个步骤: 1. 打开pak文件,可以使用文件读取函数将pak文件读入内存。 2. 解析pak文件的头部信息,获取pak文件的版本、文件数量等信息。 3. 解析目录索引表或配置文件,构建内存中的适当数据结构,如哈希表或树结构,用于快速查找和访问pak文件中的资源。 4. 根据需要,逐个读取和加载pak文件中的资源文件到内存中,并进行必要的处理,如解码、解压缩等。 5. 在程序需要使用pak文件中的资源时,根据已构建的数据结构进行快速的资源访问。 总之,加载pak文件是一项复杂的任务,需要在程序中实现相关的文件读取、解析和资源管理功能。通过正确加载和使用pak文件,程序可以高效地获取和利用其中的资源,提升用户体验和程序性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值