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" |