gpt4 book ai didi

unreal-engine4 - 虚幻引擎 4 : What is correct way to PAK files, 加载/挂载它们并在打包游戏中使用 AssetRegistry 加载 Assets ?

转载 作者:行者123 更新时间:2023-12-03 23:13:56 34 4
gpt4 key购买 nike

我想做这个:
创建并打包原始游戏。然后我想根据原始游戏中的蓝图创建具有新网格/声音/动画和蓝图的其他 PAK 文件。原始游戏不应该知道有关其他网格/动画/等的任何信息。因此,我需要在原始游戏中使用 AssetRegistry 创建一个智能系统,该系统会扫描所有 PAK 文件,加载/挂载它们,并使用 AssetRegistry 扫描这些 PAK 文件中的所有 Assets 。

我为实现目标做了什么:
我为目标平台(Windows 独立)成功创建并打包了原始游戏。然后在项目中,我创建额外的内容并为目标平台制作它们。我使用 UnrealPak.exe 为附加内容创建 PAK 文件。我可以通过将PAK文件放在Paks文件夹中来加载/挂载原始游戏中的PAK文件,并在游戏启动时加载/挂载(这句话基于原始游戏的LOG文件,我不知道如何检查它是否正确)。通过使用 FCoreDelegates::OnMountPak.Execute(这句话也是基于原始游戏的 LOG 文件),我甚至可以使用代码加载/挂载 PAK 文件。所以加载/挂载 PAK 文件应该可以正常工作。但现在最大的问题在哪里。我想使用 AssetRegistry 扫描所有 PAK 文件中的所有 Assets 。我尝试了我想出的一切。我尝试了 ScanPathsSynchronous 方法,GetAllAssets 方法。只会发生它从原始游戏 PAK 文件加载 Assets 。似乎 AssetRegistry 对其他 PAK 文件一无所知。我试图用 AddPath 方法告诉 AssetRegistry 那些文件在哪里,但仍然不起作用。

所以我尝试的示例代码在这里:

         FString path1 = FPaths::ConvertRelativePathToFull(FString("../../../TestPaks/Content/Paks/test.pak"));
FString path2 = FPaths::ConvertRelativePathToFull(FString("../../../TestPaks/Content/Paks/testmaterial.pak"));

bool check1 = false;
bool check2 = false;
if (FCoreDelegates::OnMountPak.IsBound())
{
check1 = FCoreDelegates::OnMountPak.Execute(path1, 0, nullptr); //Number should be 0-4; specifies search order
check2 = FCoreDelegates::OnMountPak.Execute(path2, 0, nullptr); //Number should be 0-4; specifies search order
}

UE_LOG(LogTemp, Warning, TEXT("%s"), *path1);
UE_LOG(LogTemp, Warning, TEXT("%s"), *path2);

FString NewString1 = check1 ? "true" : "false";
FString NewString2 = check2 ? "true" : "false";
UE_LOG(LogTemp, Warning, TEXT("check 1 = %s"), *NewString1);
UE_LOG(LogTemp, Warning, TEXT("check 2 = %s"), *NewString2);

FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(FName("AssetRegistry"));
IAssetRegistry& assetRegistry = AssetRegistryModule.Get();

TArray<FString> ContentPaths;
TArray<FAssetData> data;
//assetRegistry.AddPath(path1);
FString contentRelativeDir = TEXT("/Game/Paks");
assetRegistry.AddPath(contentRelativeDir);
assetRegistry.ScanPathsSynchronous({ contentRelativeDir });
//assetRegistry.SearchAllAssets(true);
assetRegistry.GetAllAssets(data, false);

assetRegistry.GetAllCachedPaths(ContentPaths);
for (FString& data : ContentPaths)
{
UE_LOG(LogTemp, Warning, TEXT("GetAllCachedPaths: %s"), *data);
}

FString NewString = FString::FromInt(data.Num());
UE_LOG(LogTemp, Warning, TEXT("%s"), *NewString);

for (int32 i = 0; i < data.Num(); i++)
{
FString s = data[i].AssetName.ToString();
FString ss = data[i].AssetClass.ToString();
UE_LOG(LogTemp, Warning, TEXT("%s | %s"), *s, *ss);
}

我尝试了很多版本的路径,但没有任何效果。我在这个困惑中大约有 2 周,我没有更多关于该做什么和什么将起作用的提示。那么这应该如何正常工作???我查看了这里的论坛和 StackOverflow,有一些解决方案,但它们不再起作用。

最佳答案

我已经从 .pak 文件加载了 Assets ,但我使用 FStreamableManager 而不是 AssetRegistry。
我将描述我所做的...

1) 挂载 .pak 文件:我只需要把额外的 .pak 文件放到 WindowNoEditor/[Project_Name]/Content/Paks/文件夹中(假设你是为 window 打包的),游戏引擎会自动挂载那个 .pak 文件。

2) 从该 .pak 文件加载/获取 Assets :

FPakPlatformFile *PakPlatformFile;
FString PlatformFileName = FPlatformFileManager::Get().GetPlatformFile().GetName();
if (PlatformFileName.Equals(FString(TEXT("PakFile"))))
{
PakPlatformFile = static_cast<FPakPlatformFile*>(&FPlatformFileManager::Get().GetPlatformFile());
}
else
{
PakPlatformFile = new FPakPlatformFile;
if (!PakPlatformFile->Initialize(&FPlatformFileManager::Get().GetPlatformFile(), TEXT("")))
{
UE_LOG(LogTemp, Error, TEXT("FPakPlatformFile failed to initialize"));
return;
}
FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);
}
TArray<FString> ArrAllMountedPakFile;
PakPlatformFile->GetMountedPakFilenames(ArrAllMountedPakFile);
for (int32 i = 0; i < ArrAllMountedPakFile.Num(); i++)
{
FString PakFileName = ArrAllMountedPakFile[i];
FString PakFilePathFull = FPaths::ConvertRelativePathToFull(PakFileName);
FPakFile PakFile(PakPlatformFile, *PakFilePathFull, false);
TArray<FString> FileList;
FString MountPoint = PakFile.GetMountPoint();
PakFile.FindFilesAtPath(FileList, *MountPoint, true, false, true);
for (int32 i = 0; i < FileList.Num(); i++)
{
FString AssetName = FileList[i];
FString AssetShortName = FPackageName::GetShortName(AssetName);
FString FileName, FileExt;
AssetShortName.Split(TEXT("."), &FileName, &FileExt);
FString NewAssetName = TEXT("/Game/<path_to_asset>/") + FileName + TEXT(".") + FileName;

FSoftObjectPath StrNewAssetRef = NewAssetName;
FStreamableManager AssetLoader;
UObject* NewLoadedObject = AssetLoader.LoadSynchronous(StrNewAssetRef);
if (NewLoadedObject)
{
// do something, cast to compatible type.
}
}
}

希望能帮到你。加油!

关于unreal-engine4 - 虚幻引擎 4 : What is correct way to PAK files, 加载/挂载它们并在打包游戏中使用 AssetRegistry 加载 Assets ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54290544/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com