關於檔案系統,官方文件猶抱琵琶半遮面,有一些很獨特的特性並沒有集中地擺出來,導致用的時候暈頭轉向。
這裡總結了目前我發現的Godot檔案系統的一些特性。
這是專門針對匯出後的,因為一些操作在編輯器裡面能跑,但是拿出來就不起作用了。
這裡並沒有"自定義Resource"之類關於Resource的高階話題,但是有Resource相關內容。
本人使用C#作為開發語言,使用GDScript的朋友還請靈活理解~
檔案的路徑和特點(常規知識)
這一部分官方文件講得比較詳細,我這裡簡單提一下。
Godot會對檔案進行組織,從而將它們管理起來,引擎的使用者要訪問被管理的檔案,需要遵循這樣的規定:
- 使用Godot提供的函式和類訪問檔案
- 個人發現常用的有這些:
ResourceLoader類
、GD.Load()
、Godot名稱空間的FileAccess類
- 個人發現常用的有這些:
- 檔案的路徑使用正斜槓
/
而不是反斜槓。 - 專案的資源目錄採用
res://
作為字首。匯出後,該目錄只讀。 - 使用者檔案目錄採用
user://
作為字首。匯出後,該目錄可讀寫,存檔之類資料可安放其中。 - 可以使用
ProjectSettings.GlobalizePath()
將Godot管理的路徑轉化為系統路徑,然後就可以用更一般的IO函式處理它們了。- 這要求檔案存在於實際的物理位置,也就是說"資源目錄"被打包匯出後用這個函式並不能找到它真正的位置,但"使用者檔案目錄"可以。
檔案的匯入
檔案被放入Godot專案資料夾後,會發生下面的情況。
- 引擎根據檔案字尾,對檔案產生一個初步的印象。
- 熟悉的字尾會被顯示在編輯器的"檔案系統"管理器顯示,不熟悉的就不顯示。
- 舉例:
.png
會顯示,.txt
會顯示,.my_cool_extension
預設不會顯示。 - 自定義資源、自定義資源匯入工具應該能影響這個過程。
- 匯入為資源。能夠變成資源的才會匯入成資源,否則只能看到它在那裡。
- 舉例:
.png
會被匯入,你可以在左上角窗格中選擇匯入為什麼型別的資源, .txt
預設不會被匯入。在實際使用時,你會發現預設情況下,txt檔案雖然能被顯示在編輯器裡,但是也不能被拖到場景裡面,也不能拖放到某個物件的檢查器裡,也不能檢視和編輯,好像顯示在這裡沒有太大的實際意義。.my_cool_extension
預設不會被匯入- 自定義資源、自定義資源匯入工具應該能影響這個過程。
打包匯出時的"非資原始檔"
匯出時,有一個專案讓人選擇——"篩選匯出非資原始檔或資料夾"。
一開始這句話我的理解是:
在這裡指定不是資源的檔案,因為它們不是資源,所以打包時會按照這個規則進行篩選,排除掉這些檔案。
但是實踐證明我的理解是錯誤的,閱讀了一些官方網站的Q&A後,我才明白這一項的意義是這樣:
有一些檔案在打包時會被忽略,因為它們不是資原始檔,在這裡指定你想保留的檔案,他們會以原始的檔案形式保留於Godot內部控制的檔案系統中以供執行時讀取。
因此,當我填寫*.miao
時,Godot打包時會保留此字尾的檔案,而不是丟棄它們。
檔案的訪問
這是一個我未曾想到的坑。
一言以蔽之,
雖然看上去都在
res://
目錄下,但是被匯入的資源處於資源的世界,非資原始檔都處於檔案的世界。
具體而言,根據上幾節所述,可以理解的是,被打包後,Godot的檔案系統中會存在這兩類內容:
- 資源。型別為引擎自帶的資源或是引擎使用者自定義的資源。
- 保留檔案。在匯出設定中指定的"非資原始檔"。
對於"資源",你必須使用Load函式(GD.Load()
或ResourceLoader.Load()
)進行載入。
對於"保留檔案",你必須使用Godot.FileAccess類
,以檔案的形式訪問。
如果你使用Godot.FileAccess類
訪問一個被認定是資源的路徑,會報錯,錯誤資訊稱"檔案不存在"。
這意味著,如果你希望將一個匯入為資源.png
的檔案看作是檔案本身,比如把它複製到使用者資訊目錄中,這其實無法實現,可能在Godot中,.png
檔案直接是以資源的形式存在的,例如Texture2D
這種資源,而資源系統登記了該png檔案的路徑,和資源進行了匹配,所以Load函式能夠找到它們。
好在Texture2D
提供了SavePng()
方法,可以間接地達到複製圖片的目標。
還有一種方案是把.png
檔案重新命名成別的字尾,讓Godot無法將其作為資源匯入,並在匯出設定中指定它,這樣它就能以"保留檔案"的方式"偷渡"了,複製到使用者資訊目錄時,再改頭換面,把字尾改成.png
。
補充:我剛剛發現了一種更簡單的方法,在檔案的匯入選項中選擇保留檔案(不匯入)
即可使檔案正式地成為"保留檔案"。
目前,我沒有研究動態匯入資源,也許動態匯入資源又有它值得一提的檔案機制吧。
參考
https://godotengine.org/qa/111374/load-an-save-files-after-export
https://www.reddit.com/r/godot/comments/j94pam/problem_with_png_files_after_export/