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"

 

 

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