UE4 自定义DLC Pak加载
废话不说,直接上干货:
.h
TSharedPtr<class FPakPlatformFile> PakPlatform;
class IPlatformFile* OldPlatform;
///Load
void LoadAndMountPak(const FString& InPath);
.cpp
void UDLCLoadOBJ::LoadAndMountPak(const FString& InPath)
{
///初始化
OldPlatform = &FPlatformFileManager::Get().GetPlatformFile();
if (!PakPlatform)
PakPlatform = MakeShareable(new FPakPlatformFile());
PakPlatform->Initialize(&FPlatformFileManager::Get().GetPlatformFile(), TEXT(""));
///开始加载
FPlatformFileManager::Get().SetPlatformFile(*PakPlatform.Get());
FString PakFileFullPath = *InPath;
if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*PakFileFullPath))
{
TSharedPtr<FPakFile> TmpPak = MakeShareable(new FPakFile(PakPlatform.Get(), *PakFileFullPath, false));
if (TmpPak)
{
///拼接新的挂载点
FString PakMountPoint = TmpPak->GetMountPoint();
int32 Pos = PakMountPoint.Find("Content/");
FString NewMountPoint = PakMountPoint.RightChop(Pos);
NewMountPoint = FPaths::ProjectDir() + NewMountPoint;
///设置
TmpPak->SetMountPoint(*NewMountPoint);
/*static int a = 1;*/
if (PakPlatform->Mount(*PakFileFullPath, 1, *NewMountPoint))
{
///读取Pak里的文件
TArray<FString> FoundFilenames;
TmpPak->FindFilesAtPath(FoundFilenames, *TmpPak->GetMountPoint(), true, true, true);
if (FoundFilenames.Num() > 0)
{
///遍历文件数组
for (auto& Filename : FoundFilenames)
{
if (Filename.EndsWith(TEXT(".uasset")))
{
///拼接加载引用
FString NewFileName = Filename;
NewFileName.RemoveFromEnd(TEXT(".uasset"));
int32 pos = NewFileName.Find("/Content/");
NewFileName = NewFileName.RightChop(pos + 8);
NewFileName = "/Game" + NewFileName;
///加载
UObject* LoadObj = StaticLoadObject(UObject::StaticClass(),NULL, *NewFileName);
}
}
}
}
}
}
FPlatformFileManager::Get().SetPlatformFile(*OldPlatform);
}
基于上面的代码,来谈几点可能会遇到的问题:
1,关于引用拼接这部分,如果不知道该这么拼,打开编辑器,右键随意资源,有个选项叫Copy Reference (复制引用),粘贴出来。就是加载的引用格式了。比如我复制一个:
SkeletalMesh’/Game/DesertDragon/Meshes/SK_DesertDragon.SK_DesertDragon’
后面的/Game/DesertDragon/Meshes/SK_DesertDragon就是需要加载的格式。不要其他的。
统一加载为Uobject之后,再根据你的需要去转换,或者你自己做一些处理。
2,有一个最要的点,如果是蓝图类的资源,引用后面要加_C,而且要用LoadClass()或者是Static Load Class(),随意。
3,需要注意的是,打包后只能加载Cook后的资源,打包之前只能加载未Cook的资源。
如果感兴趣可以去国内最大学习网站bilibili(哈哈哈哈哈哈),UE4官方一个中文直播,打扮家UI框架那一期就具体讲了这个,本篇文章就是基于那位大神的讲解。链接如下:
https://www.bilibili.com/video/BV1Ut411A7sk