Creator 资源加载对文件扩展名限定的疑惑!!!

使用 resources.load(“module”, (err, data: any) => {}); 并且文件的扩展名必须为".bin", 完成回调中的data则是BufferAsset, data._buffer 就是unit8Array数据.

关键就是 引擎组为什么一定限定扩展名为 .bin?
我认为: 文件就是一个容器,容器里面放什么东西以及如何使用都由开发者自己决定。引擎底层不能想当然地以为开发者应该如何如何并由此做出各种限定。

引擎组的各位大大能否解释下,这样的设计的缘由是为啥?!!!

搜一下mimetype, 而且不限定,引擎怎么知道你这个是二进制来表示,unity还限定bytes呢

引擎为什么一定要知道某个类型的文件是不是二进制?这个不是开发者自己决定的吗?

比如:*.png可以是图片文件,也可以不是图片文件。 这是开发者自己的事情,为什么引擎要知道?

resources.load(“module”, (err, data: any) => {});
路径信息中还不支持写文件扩展名,难道同一目录下,就不允许两个名称一样但是扩展名不一样的文件。
如果一个目录下有两个名称一样但是扩展名不一样的文件,该如何访问。 文件资源不是引擎支持的资源类型都是自定义的二进制文件资源。

引擎可以不知道,但是目前编辑器是需要知道的。编辑器通过扩展名导入资源,不同类型资源的导入方式不一样。目前不支持用户随意设置要用什么方式导入某个扩展名。

编辑器需要导入资源,这是可以理解的,但是编辑器也不能光靠扩展名就确定资源类型吧。
比如遇到*.png的文件,但是加载解析后发现并不是png的图片 编辑器在console窗口给出警告就可以了。
但是现在编辑器在console窗口给出的却是错误。

编辑器给出了警告,用户就会知道出了什么问题,然后再采取相应的处理方法。

我觉得引擎层不能因为编辑器需要通过扩展名去确定资源类型,就在引擎层的资源加载设计上做出各种限定。引擎层应当做出不同层次的接口供使用者选择。编辑器说到底也是引擎层的一个使用者,不能简单地为了方便编辑器却把不方便留给广大开发者。

望引擎组大大们好好思量下! 也希望Creator越来越好用!!!!

你希望最好的方式是啥样的?或者是有啥特别的需求么?

是 resource.load 也传入扩展名,不必传入类型么?
还是希望所有类型都不通过扩展名进行类型校验?实现类似 .png 可以是一个二进制数据一样的功能?

如果是希望加载的时候动态去更改类型,那么这个资源的处理就必须是在线的了。
现在我们采用的是离线处理资源的方法,这里并没有迎合编辑器或者引擎。
在线处理的性能损失还是很可观的,比如现在的资源处理,是在启动编辑器的时候,使用扩展名进行文件的初步筛选,粗筛之后,将文件放到对应的导入器进行校验,看看内容是不是正确的,如果不正确,再换下一个可能的导入器试试。
如果我们将整个流程放到运行时去动态决定类型,那每一次启动游戏,都会像第一次启动编译器一样慢,引擎的包体也会大非常多,一些可执行程序库也没办法放到小游戏,web之类的平台上。
所以现在大多数编辑器都采用了离线处理,引擎拿处理后的数据,处理后的数据也不在乎扩展名了~

其实不管是扩展名还是 mimetype 或者什么标记,都只是用来识别资源是某种类型的一种手段,重要的是引擎是认预处理后的数据,而不是认文件。

1赞

编辑器对资源的预处理是需要的,引擎可以根据预处理信息加载资源。
对于编辑器预处理过程中不能识别的文件,引擎层可以提供像访问原始文件那样的接口,可以支持文本和二进制两种方式

resource.load() 最好可以支持传入扩展名 其实也就是在预处理资源过程中以文件全名称做为关键字,而不是把扩展名去掉。
在实际应用过程中,比如在制作地图的时候,会把地图上的一些信息导出成不同的文件,这些文件就只是扩展名不同,游戏加载的时候通过扩展名去判定数据类型。

所以可以理解成游戏里其实是有多个同名,但扩展名不一样的文件,希望是能够拿到完整的扩展名,这样可以在游戏里判断是什么类型的东西么?

对于编辑器预处理过程中不能识别的文件,引擎层可以提供像访问原始文件那样的接口,可以支持文本和二进制两种方式

这是希望不能被识别的资源可以自己处理吧?现在如果一个资源是编辑器未知的类型的话,是会直接导入成一个普通的 cc.Asset 里面有个 native,通过它可以拿到一些信息,应该能做大部分的运行时判断。

游戏中有多个同名却只是扩展名不一样的文件在同一目录下 希望可以通过文件全名称(带着扩展名)去访问资源。

至于不能被识别的资源 现在是有办法去读取数据的

可是这样的话,不能预先知道,也需要连续下载多次。

for (let ext of arr) {
resource.load(`xxx.${ext}`);
}

和连续下载多次,传入第二个参数(类型)感觉也是一样的

问题是 对于自定义格式的文件 第二个参数(类型) 该如何传呢?
游戏中可不想使用 *.bin 这样统一的扩展名 开发者也可能需要利用扩展名去做资源类型的判定

还有你说的 不能预先知道 这个应当是不成立的。
作为开发者,对于自身游戏项目中的资源文件 想必是很清楚的

就算xxx.${ext} 不存在 那么资源访问返回不成功。


当成项目外的远程文件加载。

1赞

我在resources目录下 创建一个目录 在目录放入文件名一样扩展名不一样的文件 编辑器会报错


我不理编辑器的报错使用loadRemote去加载,得到如下结果:

图中 *******.map就是我要加载的文件

就算可以通过loadRemote加载也无济于事
实在是不理解:为什么引擎层要武断地设定同一目录下不能存在多个同名却扩展名不一样的文件

报错的原因是资源类型无法识别,无法用类型加载到明确的资源。如果类型无法识别就会统一做为二进制处理。如果类型识别出来,(不同类型),那么就能够重名。
如果我们允许用扩展名加载,那么过段时间可能也会有一个开发者发出一样的问题

实在是不理解:为什么引擎层要武断地设定同一目录下可以存在多个同类型却扩展名不一样的文件

而且依赖扩展名有多坑?会影响到多少基础体验?怎么想都不值得。

非要依赖扩展名,改个名字就好了。比如 .map -> .map.bin, .objs -> .objs.bin

我只能对你们的脑回路表示无限崇高的敬意!

说白了,name+ext 只是一个资源的路径。 文件的内容是什么完全由开发自己决定,能够识别的文件,当然可以按你们预处理的方式去处理,不能处理的你们就当做普通文件,让开发者自己去加载就好了。

现在的问题是我在一个目录下,放了一个name一样只是扩展名不一样的文件,就没有办法访问了。 这是什么道理?

开发者还要关心资源的扩展名,我也是第一次见到

哪天美术把图片格式改一下,或者启用一个压缩纹理格式,项目就跪了哈哈哈

这里面要考虑的点非常多,很抱歉没办法详细解释。
Creator 是一个严重依赖编辑器进行资源导入的引擎,这个导入过程很有可能对扩展名进行改写。
如果允许用原有的名字去加载一个改写后的格式,也容易引起歧义和理解上的阻碍。
在你看来是给到开发自由度,在我们看来弊大于利,可能是我们操心过多,非常抱歉。

我不知道你们在担心什么?
看看市面上的引擎, unity也好,unreal也好 都没有类似的限制
同一目录下不允许存在多个名称一样扩展名不一样的文件资源