关于文件系统,官方文档犹抱琵琶半遮面,有一些很独特的特性并没有集中地摆出来,导致用的时候晕头转向。

这里总结了目前我发现的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/

Godot 4.0 文件系统特性的总结的更多相关文章

  1. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

  2. GODOT 3.0 开发进度汇报 #7

    由于原文采取了记流水账的方式,觉得没有必要照直翻译了,就只选取了其中的主要信息. GDNative C++ 语言绑定 进行了重写以便Godot更好的生成和处理脚本. D 语言绑定 也正在积极开发中. ...

  3. GODOT 3.0 开发进度汇报 #6

    经过了又一个月的开发工作,在此作进度报告.本月的工作可以划分为:完成Web导出工具开发.GDNative.以及新的粒子系统. Web Export Godot 现在有了一款实验性的导出工具,导出目标为 ...

  4. 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.  托管与本地 ...

  5. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  6. Mysql 8.0 新特性测试

    Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...

  7. 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?

    来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...

  8. Java基础和JDK5.0新特性

    Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...

  9. vertica 8.0 新特性

    前言: <<line>> 表明在vertica 8.0文档中的title   正文: 1-支持平台 1.1-操作系统 <<Vertica Server and Ve ...

  10. Visual Studio 2015速递(1)——C#6.0新特性怎么用

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

随机推荐

  1. 剑指Offer2---------替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   重点: ...

  2. C语言转义序列

    转义序列 含义 \a 报警(ANSIC) \b 退格 \f 换页 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \\ 反斜杆\ \' 单引号 \" 双引号 \? 问号 \0oo ...

  3. Spring Cloud netty

    <properties> <spring.boot.version>2.3.2.RELEASE</spring.boot.version> <spring.c ...

  4. .Net5.0 上传图片、文件到服务器

    今天来看看.net上传图片到服务器的方式 public class ControlPresetUploadInput { /// <summary> /// 通道编号 /// </s ...

  5. Oracle 取Group By 第一条

    select *from (select emp.*,row_number() over(partition by deptno order by rownum) cn from emp)where ...

  6. win10下Word点击链接跳转,提示“由于本机的限制,该操作已取消”

    Word按住Ctrl点击链接进行跳转,提示"由于本机的限制,该操作已取消,请联系管理员" 网上很多,修改注册表 这边要说的是,修改重启word ,还不行的解决方法:点开任务管理器- ...

  7. [ABC284F] ABCBAC(字符串哈希)

    思路 这里我们要注意以下几点: 字符串哈希自然溢出(\(\pmod 2^64\))会被卡,会\(WA~5\)个点 注意有模数的时候不要用\(unsigned\ long \ long\)类型 代码 # ...

  8. react+ant-design-proTable 设置搜索条件中的默认值

    需求: 这个规则组ID的 下拉列表是通过向后端请求获取的,如何设置自定义渲染列表,并且默认有值 let groupLists = [] as any, //规则组列表 defaultValue = ' ...

  9. Linux 里面安装多个jdk,进行切换

    alternatives --config java

  10. Centos6、7修改主机名

    centos6 1.临时修改 hostname node1 2.永久生效 , 修改/etc/sysconfig/network 文件 HOSTNAME=node1 3.修改 /etc/hosts文件 ...