關於檔案系統,官方檔案猶抱琵琶半遮面,有一些很獨特的特性並沒有集中地擺出來,導致用的時候暈頭轉向。
這裡總結了目前我發現的Godot檔案系統的一些特性。
這是專門針對匯出後的,因為一些操作在編輯器裡面能跑,但是拿出來就不起作用了。
這裡並沒有"自定義Resource"之類關於Resource的高階話題,但是有Resource相關內容。
本人使用C#作為開發語言,使用GDScript的朋友還請靈活理解~
這一部分官方檔案講得比較詳細,我這裡簡單提一下。
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://
目錄下,但是被匯入的資源處於資源的世界,非資原始檔都處於檔案的世界。
對於"資源",你必須使用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/