使用IPlatformFile進(jìn)行Shader文件在開發(fā)協(xié)同
來源:
52vr |
責(zé)任編輯:傳說的落葉 |
發(fā)布時(shí)間: 2019-06-13 08:18 | 瀏覽量:
這篇文章介紹了如何使用IPlatformFile來實(shí)現(xiàn)Shaders文件在開發(fā)團(tuán)隊(duì)間的共享。
這篇文章所涉及的代碼來自Temaran的UE4ShaderPluginDemo里面的ShaderCopyHelper插件。
背景
雖然UE4的材質(zhì)編輯器已經(jīng)足夠強(qiáng)大并且可以支持大部分的需求了,但是有時(shí)候我們還是需要自定義自己的Shader。
但是由于UE4的著色器必須位于Engine/Shaders/文件夾下,這樣一來針對(duì)那些不進(jìn)行定制化UE4的開發(fā)團(tuán)隊(duì)來說,對(duì)Shaders文件夾進(jìn)行代碼管理就不太方便了。
解決方案
對(duì)于開發(fā)團(tuán)隊(duì)來說,最好的解決方案便是在項(xiàng)目文件夾下維護(hù)一個(gè)Shaders文件夾。由于Shaders文件夾位于項(xiàng)目文件夾下,因此對(duì)其進(jìn)行代碼管理就是一件非常容易的事。
那么我們要做的便是在引擎打開時(shí),將項(xiàng)目下的Shaders下的文件復(fù)制到Engine/Shaders/文件夾中,并且在引擎關(guān)閉時(shí),將這些文件刪除。
使用插件uplugin
由于UE4的插件可以將StartupModule()和ShutdownModule()直接暴露出來,并且可以指定其只在編輯器(Developer)下啟用,因此無疑成為了這個(gè)功能實(shí)現(xiàn)的最好平臺(tái)。
[代碼]:
1 |
"Modules" : |
2 |
[ |
3 |
{ |
4 |
"Name" : "ShaderCopyHelper" , |
5 |
"Type" : "Developer" , |
6 |
"LoadingPhase" : "PostConfigInit" |
7 |
} |
8 |
] |
代碼實(shí)現(xiàn)
了解原理后,具體的實(shí)現(xiàn)就很簡單了。先遍歷項(xiàng)目文件夾下的Shaders文件夾并獲得所有的Shader文件名:
[代碼]:
1 |
bool FShaderFileVisitor::Visit( const TCHAR* FilenameOrDirectory, bool bIsDirectory) |
2 |
{ |
3 |
if (!bIsDirectory) |
4 |
{ |
5 |
ShaderFilePaths.Add(FPaths::GetCleanFilename(FilenameOrDirectory)); |
6 |
} |
7 |
8 |
return true ; |
9 |
} |
在整個(gè)模塊startup時(shí),使用IPlatformFile::CopyFile(const TCHAR* To, const TCHAR* From)函數(shù)進(jìn)行文件的拷貝:
[代碼]:
01 |
void FShaderCopyHelperModule::StartupModule() |
02 |
{ |
03 |
UE_LOG(ShaderCopyHelper, Log, TEXT( "Shader Copy Helper Plugin loaded!" )); |
04 |
05 |
FString GameShadersDirectory = FPaths::Combine(*FPaths::GameDir(), TEXT( "Shaders" )); |
06 |
FString EngineShadersDirectory = FPaths::Combine(*FPaths::EngineDir(), TEXT( "Shaders" )); |
07 |
08 |
ShaderFiles = new FShaderFileVisitor(); |
09 |
IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); |
10 |
PlatformFile.IterateDirectoryRecursively(*GameShadersDirectory, *ShaderFiles); |
11 |
12 |
UE_LOG(ShaderCopyHelper, Log, TEXT( "Copying project shader files to Engine/Shaders/" )); |
13 |
for (int32 ShaderFileIndex = 0; ShaderFileIndex < ShaderFiles->ShaderFilePaths.Num(); ShaderFileIndex++) |
14 |
{ |
15 |
FString CurrentShaderFile = ShaderFiles->ShaderFilePaths[ShaderFileIndex]; |
16 |
FString GameShaderFullPath = FPaths::Combine(*GameShadersDirectory, *CurrentShaderFile); |
17 |
FString EngineShaderFullPath = FPaths::Combine(*EngineShadersDirectory, *CurrentShaderFile); |
18 |
19 |
if (PlatformFile.CopyFile(*EngineShaderFullPath, *GameShaderFullPath)) |
20 |
{ |
21 |
UE_LOG(ShaderCopyHelper, Log, TEXT( "Shader file %s copied to %s." ), *GameShaderFullPath, *EngineShaderFullPath); |
22 |
} |
23 |
else |
24 |
{ |
25 |
UE_LOG(ShaderCopyHelper, Warning, TEXT( "Could not copy %s to %s!" ), *GameShaderFullPath, *EngineShaderFullPath); |
26 |
} |
27 |
} |
28 |
} |
同樣的,在模塊退出時(shí),將這些文件刪除:
[代碼]:
01 |
void FShaderCopyHelperModule::ShutdownModule() |
02 |
{ |
03 |
FString EngineShadersDirectory = FPaths::Combine(*FPaths::EngineDir(), TEXT( "Shaders" )); |
04 |
IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); |
05 |
06 |
UE_LOG(ShaderCopyHelper, Log, TEXT( "Deleting project shaders from Engine/Shaders/" )); |
07 |
for (int32 ShaderFileIndex = 0; ShaderFileIndex < ShaderFiles->ShaderFilePaths.Num(); ShaderFileIndex++) |
08 |
{ |
09 |
FString EngineShaderFullPath = FPaths::Combine(*EngineShadersDirectory, *ShaderFiles->ShaderFilePaths[ShaderFileIndex]); |
10 |
11 |
if (PlatformFile.DeleteFile(*EngineShaderFullPath)) |
12 |
{ |
13 |
UE_LOG(ShaderCopyHelper, Log, TEXT( "Shader file %s deleted." ), *EngineShaderFullPath); |
14 |
} |
15 |
else |
16 |
{ |
17 |
UE_LOG(ShaderCopyHelper, Warning, TEXT( "Could not delete %s!" ), *EngineShaderFullPath); |
18 |
} |
19 |
} |
20 |
21 |
delete ShaderFiles; |
22 |
23 |
UE_LOG(ShaderCopyHelper, Log, TEXT( "Shader Copy Helper Plugin unloaded!" )); |
24 |
} |
這樣一來,團(tuán)隊(duì)中的成員只需要啟用這個(gè)插件,然后維護(hù)Shaders文件夾就可以了。
-
分享到:
相關(guān)文章
網(wǎng)友評(píng)論
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
關(guān)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
推薦
熱門