ue4 文件操作

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.如果需要设置,则创建指定的“包裹文件系统,并设置为当前文件系统,包裹文件系统包含了一个更低层次的文件系统更低层次的文件系统通常命名是LowerLevelLowerLevel可以是其他包裹其他文件系统或是物理文件系统。进行某些操作时,先执行自身的操作,再执行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"

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章