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

[cpp]  view plain  copy
  1. UFUNCTION(BlueprintCallable, Category = "PAK")  
  2.     void LoadPakComplete();  
  3. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PAK")  
  4.     UObject*  TheLoadObject ;  
.cpp

#include "IPlatformFilePak.h"

[cpp]  view plain  copy
  1. void AMyActor::LoadPakComplete()  
  2. {       //如果你想直接加载本地的pak的话,方法的参数列表删掉,然后把SaveArrayToFile这句话也删了,SaveContentDir填写你要加载的路径就可以了...  
  3.         //1.把下载好的文件保存起来  
  4.     FString SaveContentDir = FPaths::GameContentDir() + TEXT("OutPak.pak");  
  5.     //2.加载刚才保存的文件  
  6.     //获取当前使用的平台,这里使用的是WIN64平台  
  7.     IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();  
  8.     //初始化PakPlatformFile  
  9.     FPakPlatformFile* PakPlatformFile = new FPakPlatformFile();  
  10.     PakPlatformFile->Initialize(&PlatformFile, TEXT(""));  
  11.     FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);  
  12.   
  13.     //获取Pak文件  
  14.     FPakFile PakFile(*SaveContentDir, false);  
  15.     UE_LOG(LogClass, Log, TEXT("get PakFile..."))  
  16.     //设置pak文件的Mount点.   
  17.     FString MountPoint(FPaths::EngineContentDir()); //"/../../../Engine/Content/"对应路径  
  18.     PakFile.SetMountPoint(*MountPoint);  
  19.     //对pak文件mount到前面设定的MountPoint  
  20.     if (PakPlatformFile->Mount(*SaveContentDir, 0, *MountPoint))  
  21.     {  
  22.         UE_LOG(LogClass, Log, TEXT("Mount Success"));  
  23.         TArray<FString> FileList;  
  24.         //得到Pak文件中MountPoint路径下的所有文件  
  25.         PakFile.FindFilesAtPath(FileList, *PakFile.GetMountPoint(), truefalsetrue);  
  26.         FStreamableManager StreamableManager;  
  27.         //对文件的路径进行处理,转换成StaticLoadObject的那种路径格式  
  28.         FString AssetName = FileList[0];  
  29.         FString AssetShortName = FPackageName::GetShortName(AssetName);  
  30.         FString LeftStr;  
  31.         FString RightStr;  
  32.         AssetShortName.Split(TEXT("."), &LeftStr, &RightStr);  
  33.         AssetName = TEXT("/Engine/") + LeftStr + TEXT(".") + LeftStr;    //我们加载的时候用的是这个路径  
  34.         FStringAssetReference reference = AssetName;  
  35.         //加载UObject  
  36.         UObject* LoadObject = StreamableManager.SynchronousLoad(reference);  
  37.         if (LoadObject != nullptr)  
  38.         {  
  39.             UE_LOG(LogClass, Log, TEXT("Object Load Success..."))  
  40.                 TheLoadObject = LoadObject;  
  41.         }  
  42.         else  
  43.         {  
  44.             UE_LOG(LogClass, Log, TEXT("Can not Load asset..."))  
  45.         }  
  46.     }  
  47.     else  
  48.     {  
  49.         UE_LOG(LogClass, Error, TEXT("Mount Failed"));  
  50.     }  
  51. }  
这样就加载到内存了。

猜你喜欢

转载自blog.csdn.net/sh15285118586/article/details/79648596
今日推荐