Godot 4.0 檔案系統特性的總結

2023-04-28 12:01:18

關於檔案系統,官方檔案猶抱琵琶半遮面,有一些很獨特的特性並沒有集中地擺出來,導致用的時候暈頭轉向。
這裡總結了目前我發現的Godot檔案系統的一些特性。

這是專門針對匯出後的,因為一些操作在編輯器裡面能跑,但是拿出來就不起作用了。
這裡並沒有"自定義Resource"之類關於Resource的高階話題,但是有Resource相關內容。


本人使用C#作為開發語言,使用GDScript的朋友還請靈活理解~


檔案的路徑和特點(常規知識)

這一部分官方檔案講得比較詳細,我這裡簡單提一下。

Godot會對檔案進行組織,從而將它們管理起來,引擎的使用者要存取被管理的檔案,需要遵循這樣的規定:

  • 使用Godot提供的函數和類存取檔案
    • 個人發現常用的有這些: ResourceLoader類GD.Load()Godot名稱空間的FileAccess類
  • 檔案的路徑使用正斜槓/而不是反斜槓。
  • 專案的資源目錄採用res://作為字首。匯出後,該目錄唯讀。
  • 使用者檔案目錄採用user://作為字首。匯出後,該目錄可讀寫,存檔之類資料可安放其中。
  • 可以使用ProjectSettings.GlobalizePath()將Godot管理的路徑轉化為系統路徑,然後就可以用更一般的IO函數處理它們了。
    • 這要求檔案存在於實際的物理位置,也就是說"資源目錄"被打包匯出後用這個函數並不能找到它真正的位置,但"使用者檔案目錄"可以。

檔案的匯入

檔案被放入Godot專案資料夾後,會發生下面的情況。

  1. 引擎根據檔案字尾,對檔案產生一個初步的印象。
  2. 熟悉的字尾會被顯示在編輯器的"檔案系統"管理器顯示,不熟悉的就不顯示。
  • 舉例: .png會顯示,.txt會顯示,.my_cool_extension預設不會顯示。
  • 自定義資源、自定義資源匯入工具應該能影響這個過程。
  1. 匯入為資源。能夠變成資源的才會匯入成資源,否則只能看到它在那裡。
  • 舉例: .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/