UE4 自定义DLC Pak加载

1 篇文章 0 订阅

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值