ue4+html5动态加载pak,UE4 pak生成和加载

本文转自:http://blog.csdn.net/u014532636/article/details/72844367

1.创建一个PAK文件:

用CMD运行打开D:\Epic Games\UE_4.15\Engine\Binaries\Win64下有个UnrealPak文件

cd到路径后 通过运行时传递参数 UnrealPak.exe [要生成的pak文件] -create=[要打包的文件列表] -order=[文件在pak中排序描述文件] [输出格式] [是否加密] [是否压缩]

例如:UnrealPak.exe test.pak -create=paklist.txt -order=CookerOpenOrder.log -UTF8Output -encrypt -compress

UnrealPak.exe D:\OutPak.Pak C:\Users\Administrator\Desktop\Client\UnrealProjects\IDHome\Content\Materials\bingxiang.uasset

这样就有一个PAK文件了,接下来创建代码

.h

UFUNCTION(BlueprintCallable, Category ="PAK")

voidLoadPakComplete();

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PAK")

UObject*  TheLoadObject ;

.cpp

#include "IPlatformFilePak.h"

voidAMyActor::LoadPakComplete()

{       //如果你想直接加载本地的pak的话,方法的参数列表删掉,然后把SaveArrayToFile这句话也删了,SaveContentDir填写你要加载的路径就可以了...

//1.把下载好的文件保存起来

FString SaveContentDir = FPaths::GameContentDir() + TEXT("OutPak.pak");

//2.加载刚才保存的文件

//获取当前使用的平台,这里使用的是WIN64平台

IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();

//初始化PakPlatformFile

FPakPlatformFile* PakPlatformFile = newFPakPlatformFile();

PakPlatformFile->Initialize(&PlatformFile, TEXT(""));

FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);

//获取Pak文件

FPakFile PakFile(*SaveContentDir, false);

UE_LOG(LogClass, Log, TEXT("get PakFile..."))

//设置pak文件的Mount点.

FString MountPoint(FPaths::EngineContentDir()); //"/../../../Engine/Content/"对应路径

PakFile.SetMountPoint(*MountPoint);

//对pak文件mount到前面设定的MountPoint

if(PakPlatformFile->Mount(*SaveContentDir, 0, *MountPoint))

{

UE_LOG(LogClass, Log, TEXT("Mount Success"));

TArray FileList;

//得到Pak文件中MountPoint路径下的所有文件

PakFile.FindFilesAtPath(FileList, *PakFile.GetMountPoint(), true,false,true);

FStreamableManager StreamableManager;

//对文件的路径进行处理,转换成StaticLoadObject的那种路径格式

FString AssetName = FileList[0];

FString AssetShortName = FPackageName::GetShortName(AssetName);

FString LeftStr;

FString RightStr;

AssetShortName.Split(TEXT("."), &LeftStr, &RightStr);

AssetName = TEXT("/Engine/") + LeftStr + TEXT(".") + LeftStr;//我们加载的时候用的是这个路径

FStringAssetReference reference = AssetName;

//加载UObject

UObject* LoadObject = StreamableManager.SynchronousLoad(reference);

if(LoadObject != nullptr)

{

UE_LOG(LogClass, Log, TEXT("Object Load Success..."))

TheLoadObject = LoadObject;

}

else

{

UE_LOG(LogClass, Log, TEXT("Can not Load asset..."))

}

}

else

{

UE_LOG(LogClass, Error, TEXT("Mount Failed"));

}

}

这样就加载到内存了。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值