1.IFileManager(用于操作更底层的文件,通过文件系统来操作文件,比如本地文件与文件夹的读,写,查询等操作。)
IFileManager::Get() //获得FFileManagerGeneric。FFileManagerGeneric 是方便管理文件的基础类,含有很多方便文件操作的方法,其内部通过文件系统管理文件
获取文件系统:
IFileManager::Get().GetLowLevel();//其内部就是调用FPlatformFileManager::Get().GetPlatformFile();
或
FPlatformFileManager::Get().GetPlatformFile();
常用的方法,例如查找文件:
IFileManager::Get().FindFiles(FileNames, *Filename, Files, Directories);
有一个更方便的FFileHelper类包含了很多方便的文件读写操作的静态函数。
FFileHelper::LoadFileToArray()
在FEngineLoop::PreInit阶段,会去通过LaunchCheckForFileOverride检测是否需要调用FPlatformFileManager::Get().SetPlatformFile(PlatformFile)设置当前的文件系统
1.如果不需要设置,默认的文件系统是物理文件系统,即IPlatformFile::GetPlatformPhysical()返回的物理文件系统。物理平台文件系统都是与系统直接操作相关。
2.如果需要设置,则创建指定的“包裹文件系统”,并设置为当前文件系统,包裹文件系统包含了一个更低层次的文件系统,更低层次的文件系统通常命名是LowerLevel,LowerLevel可以是其他包裹其他文件系统或是物理文件系统。在进行某些操作时,先执行自身的操作,再执行lowerlevel的操作,(比如IFileManager::Get().FindFiles()进行文件查询时,FPakPlatformFile先执行自己的IterateDirectory,将pak文件中的资源解包并将资源放入查找结果中,而不是将pak文件放入查找结果中,然后再执行LowerLevel的IterateDirectory)。LowerLevel在包裹文件系统执行Initialize时设置(必须设置)。LaunchCheckForFileOverride会创建一个链式的包裹文件系统。具体看源码。
(比如检测到!WITH_EDITOR 为true(WITH_EDITOR 表示带有编辑器,通过ue4Editor.exe 运行的都是WITH_EDITOR ),并且通过FPakPlatformFile::GetPakFolders返回的多个目录(工程目录的content目录的Paks目录,工程目录的saved目录下的Paks目录,Engine目录下的Paks目录),包含有pak文件,则将FPakPlatformFile设置为当前文件系统。并将物理文件系统设置为lowerlevel)
2.UAssetManager(用于操作资源文件,方便资源文件系统的操作。比如获取FStreamableManager对象用于异步加载。获取AssetRegistry(资源注册表)方便资源查询和搜索,以及资源之间的互相引用)
TArray<FSoftObjectPath> ItemsToStream;
for(int32 i = 0; i < ItemList.Num(); ++i)
{
ItemsToStream.AddUnique(ItemList[i].ToStringReference());
}
//默认为异步加载,如有命令行输入-GAME,-SERVER, 以Commandlet为结尾的开关,或以RUN=为开头的开关,表示IsRunningCommandlet,则为同步加载
TSharedPtr<FStreamableHandle> StreamableHandle = UAssetManager::Get().LoadAssetList(ItemsToStream, FStreamableDelegate::CreateUObject(this, &UGameCheatManager::GrantItemsDeferred))
StreamableHandle->ReleaseHandle()//需要手动释放资源
FStreamableManager
TArray<FSoftObjectPath> ItemsToStream;
for(int32 i = 0; i < ItemList.Num(); ++i)
{
ItemsToStream.AddUnique(ItemList[i].ToStringReference());
}
FStreamableManager& Streamable =UAssetManager::GetStreamableManager();
Streamable.RequestAsyncLoad(ItemsToStream, FStreamableDelegate::CreateUObject(this, &UGameCheatManager::GrantItemsDeferred));
}
AssetRegistry
IAssetRegistry& AssetRegistry = UAssetManager::Get().GetAssetRegistry()
FName PackageName("/game/myasset");//资源全路径为/game/myasset.myasset
TArray<FName> OutReferencers;
AssetRegistry.GetReferencers(FName PackageName, OutReferencers)
还可以获取路径(文件夹)信息
在使用烘焙版本的资源时,会加载 FPaths::ProjectDir() / TEXT("AssetRegistry.bin")来获取所有资源与路径信息,该文件是在烘焙过程中自动生成的。在打包成pak时,自动包含。也就是打包的游戏也是有的。
使用未烘焙版本的资源时,也就是使用编辑器时,
1.如果是IsRunningCommandlet(也就是运行编辑器时,使用了命令行参数-GAME,-SERVER, 以Commandlet为结尾的开关,或以RUN=为开头的开关)则资源的信息并不能全部获取,要获取某一路径下的资源信息和路径信息,要先调用UAssetManager::Get().GetAssetRegistry().ScanPathsSynchronous(path) 和UAssetManager::Get().GetAssetRegistry().ScanFilesSynchronous(path)搜索资源和路径信息,才能读到。如果不是2.如果不是IsRunningCommandlet,则资源和路径信息会在后台异步加载,所以有可能会出现当去获取资源信息,而信息还有异步scan却没有读到的情况,。
Asset Package
实际上UE4中没有Asset Package这个名词,只有Package,为了区别于Packaging Project的package,这里先声明这样的记法。Asset Package,就是指的在UE4中能够在直接使用的游戏资源,比如material,map,blueprint等,每一个独立的资源的对应一个Package概念。
-
一个Asset Package可能包含多个File,比如cooked之后的usset实际上可能会分离出.uexp .ubulk等文件。
-
多个Asset Package可以称作一个Pack,比如Add Feature Pack就是提供了一系列Asset Packages。
-
Asset Package和UOject关系很紧密,直接Load的Asset Package就是一个UObject对象。
-
FPackageName就是我们通常在Load Asset时使用的路径形式。更为具体点就是FStringAssetReference。但是注意FStringAssetReference不是一个字串,不要被名字迷惑。
3.FPaths(用于返回各种系统路径,以及对路径进行快捷操作)
例如返回各种路径:
各种系统路径 |
|
LaunchDir |
也就是工作目录,是绝对路径,ios与Android上是“/”。 |
EngineDir |
以工作目录为基础,../../../Engine/,(比如:如果是通过编辑器icon打开的工程,工作目录是引擎的ue4editor.exe所在目录). 返回的是相对目录 |
FWindowsPlatformProcess::BaseDir |
启动目录,也就是exe执行文件所在目录,是相对路径获取绝对路径的基础。 |
RootDir |
EngineDir的上层目录 |
ProjectDir |
如果是通过*.uproject文件打开的工程,而不是打包好的,则是uproject文件所在的目录。如果打包好的工程,如果是桌面系统(windows,linux,mac),则是工程目录是以可执行文件所在目录为基础,../../ |
ProjectUserDir |
如果是shoping版本的,windows下是在c盘的C:\Users\Administrator\AppData\Local\【ProjectName】\ 否则就是ProjectDir |
ProjectSavedDir |
ProjectDir/Saved/ |
GeneratedConfigDir |
ProjectSavedDir/Config/ |
ScreenShotDir |
ProjectSavedDir/Screenshots/ |
VideoCaptureDir |
ProjectSavedDir/VideoCaptures/ |
HasProjectPersistentDownloadDir |
是否有可下载路径,暂时都是true |
ProjectPersistentDownloadDir |
通常是ProjectDir/PersistentDownloadDir, Android与mac是可写目录 |
常用方法 |
|
GetExtension |
获取文件扩展名 |
GetCleanFilename |
获取文件名,带扩展名 |
GetBaseFilename |
获取文件名,不带扩展名 |
GetPath |
获取路径,无文件名 |
FileExists |
检测文件是否存在 |
DirectoryExists |
检测文件夹是否存在 |
IsRelative |
是否是相对路径 |
RemoveDuplicateSlashes |
删除重复的/ * For example, takes the string: * BaseDirectory/SomeDirectory//SomeOtherDirectory////Filename.ext * and converts it to: * BaseDirectory/SomeDirectory/SomeOtherDirectory/Filename.ext */ |
CollapseRelativeDirectories |
将相对路径缩减到最短 * For example, takes the string: * BaseDirectory/SomeDirectory/../SomeOtherDirectory/Filename.ext * and converts it to: * BaseDirectory/SomeOtherDirectory/Filename.ext */ |
ConvertRelativePathToFull(FString&& InPath) |
将相对路径以FWindowsPlatformProcess::BaseDir(启动目录)为基础,转换为绝对路径 |
ConvertRelativePathToFull(const FString& BasePath, const FString& InPath) |
将相对路径以BasePath,转换为绝对路径,如果BasePath为相对路径,结果仍是先对路径 |
Split( const FString& InPath, FString& PathPart, FString& FilenamePart, FString& ExtensionPart ) |
将inpath 分离为 路径,文件名,扩展名 |
Combine |
将路径进行组合Combine("p", "u","t")->"p/u/t" |