Godot 4.0 文件系统特性的总结
关于文件系统,官方文档犹抱琵琶半遮面,有一些很独特的特性并没有集中地摆出来,导致用的时候晕头转向。
这里总结了目前我发现的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/
Godot 4.0 文件系统特性的总结的更多相关文章
- Django 2.0 新特性 抢先看!
一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...
- GODOT 3.0 开发进度汇报 #7
由于原文采取了记流水账的方式,觉得没有必要照直翻译了,就只选取了其中的主要信息. GDNative C++ 语言绑定 进行了重写以便Godot更好的生成和处理脚本. D 语言绑定 也正在积极开发中. ...
- GODOT 3.0 开发进度汇报 #6
经过了又一个月的开发工作,在此作进度报告.本月的工作可以划分为:完成Web导出工具开发.GDNative.以及新的粒子系统. Web Export Godot 现在有了一款实验性的导出工具,导出目标为 ...
- Atitit. C#.net clr 2.0 4.0新特性
Atitit. C#.net clr 2.0 4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1. 托管与本地 ...
- Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)
1. Annotation注解 1.1. Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...
- Mysql 8.0 新特性测试
Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...
- 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?
来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...
- Java基础和JDK5.0新特性
Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...
- vertica 8.0 新特性
前言: <<line>> 表明在vertica 8.0文档中的title 正文: 1-支持平台 1.1-操作系统 <<Vertica Server and Ve ...
- Visual Studio 2015速递(1)——C#6.0新特性怎么用
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
随机推荐
- 在 vuex 中建立一个 permission.js 文件用于合并静态和动态的路由规则
结果会获取完整的用户的路由规则 // 新建一个vuex模块来专门处理权限相关操作 import { constantRoutes, asyncRoutes } from "@/router& ...
- SQL SERVER 2014 双机热备操作流程-数据库双向同步 (第一篇:发布)
需求:需要两个数据库双向同步,即A数据库变动,B及时更新.B数据库变动,A及时更新.思路:利用SQL Server的发布和订阅功能进行同步,在A数据库进行发布<合并发布>,在B数据库进行订 ...
- Ubuntu 22.04 安装 VMWare 16.2.3 后无法启动
异常日志: 2022-06-13T03:49:56.019Z In(05) host-29676 In file included from /tmp/modconfig-XR2GVI/vmmon-o ...
- WPF中的DataGrid支持Excell粘贴数据
其中XMAL文件中的表格样式: <DataGrid x:Name="DataListView" AutoGenerateColumns="False" H ...
- 记我的第一个UVM项目
没有天天写博客的习惯,后果就是老是忘记自己的排版风格.为了追求统一还要翻一下之前是怎么写的.这也算是意料之外的发现吧. 说实话,没人教的话从零开始学一个新的东西实在是太难了.即使互联网的存在已经大幅降 ...
- 后端004-JWT工具类的编写
登录功能采用springsecurity安全框架和jwt令牌 首先需要添加依赖信息 在yml中添加JWT的配置文件 有了上述的配置之后,我们可以准备一个JWT的工具类,方便后面和JWT相关的内容去使用 ...
- Flask CURD(增删改查)
1.创建flask项目 2.修改配置文件: ''' config.py 保存项目配置 ''' 导入Flask模块 from flask import Flask 额外安装: 数据库操作模块 from ...
- linux虚拟机设置网络显示NetworkManager need to be running
问题描述:在设置一台centOS7虚拟机的网络时出现: 解决方法: 命令行重启NetworkManager systemctl restart NetworkManager 刷新一次就好了
- 什么是Placement new ?
1. 什么是placementNew placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象.用于需要反复创建并删除的对象上,可以降低分配释 ...
- [转]C++回调函数
回调函数 回调函数是一个时时听到的概念,比如在windows API编程时遇到的WinProc函数,就是我们编写而由操作系统调用的函数.现在,我们需要慢慢又详细的记录一下这个问题. 库与使用者的问题 ...