ue4挂载其他工程生成的pak,打开level

1.pak的MountPoint的计算

UE4在创建pak文件时会对MountPoint进行计算,用一句话来概括计算逻辑就是:UE4会收集所有打包到pak中的文件,然后提取它们目录的公共部分作为MountPoint

 

下面以一个例子来说明。假设我们有3个文件需要打包到pak中,它们的路径分别为"../../../MyProject/Content/A.uasset"、"../../../MyProject/B.uasset"以及"../../../C.uasset"。

  1. 计算开始时,首先获取最长的路径,为"../../../MyProject/Content/"
  2. 接着开始遍历每个文件
  3. 遍历到"../../../MyProject/B.uasset"时,其路径为"../../../MyProject/“,并不包含"../../../MyProject/Content/",因此公共路径变为"../../../MyProject/“
  4. 同理,当遍历到"../../../C.uasset"时,公共路径变为"../../../"
  5. 此时所有文件处理完毕,MountPoint就是"../../../",会被写入pak文件中

2.FPackageName::RegisterMountPoint

根据上面的算法,不同project的pak,uasset的路径都会带上"MyProject/Content/"和"MyProject2/Content/"这样的路径。

加载的时候,需要增加一个全局的MountPoint来替换这个加载路径

3.获取生成pak的Project Name

 根据pak的生成规则,需要获取到pak工程对应的Project Name

这里使用"/Mod/"来作为pak的RootPath.

4.加载pak并设置MountPoint

    //搜索pak文件
    TArray<FString> Result;
	IFileManager::Get().FindFiles(Result, *Dir, TEXT("*.pak"));

	FPakPlatformFile* PakFileMgr = (FPakPlatformFile*)FPlatformFileManager::Get().GetPlatformFile(FPakPlatformFile::GetTypeName());

	for (auto& Pair : Result)
	{
		auto FilePath = Dir + Pair;
		UE_LOG(LogTemp, Warning, TEXT("PreLoadMod %s"), *FilePath);
		
		FPakFile* Pak = new FPakFile(&PlatformFile, *FilePath, false);
		if (Pak->IsValid())
		{
			FString MountPoint(*Pak->GetMountPoint()); //获取Pak上的挂载点
			UE_LOG(LogTemp, Warning, TEXT("GetMountPoint %s"), *MountPoint);
			
            //从pak文件名中获取打包的ProjectName
			FString Left, Right;
			FPaths::GetBaseFilename(FilePath).Split(TEXT("-"), &Left, &Right);

			MountPoint.ReplaceInline(TEXT("../../../"), *FPaths::ProjectDir());
			Pak->SetMountPoint(*MountPoint);

            //设置pak的全局搜索路径
			FPackageName::RegisterMountPoint("/Mod/", Pak->GetMountPoint()+ Left + TEXT("/Content/"));

			if (PakFileMgr->Mount(*(Dir + Pair), 0, *Pak->GetMountPoint()))
			{
				//带上/Mod/作为搜索路径,避免默认从/Game/中搜索
                UGameplayStatics::OpenLevel(GetWorld(),FName(TEXT("/Mod/Test")));
			}
		}

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值