<h2>1.资源与构建</h2>
<h3>1.1 creator资源文件基础</h3>
<p>在了解引擎如何解析、加载资源之前,我们先来了解一下这些资源文件(图片、Prefab、动画等)的规则,在creator项目目录下有几个与资源相关的目录:</p>
<ul>
<li>assets 所有资源的总目录,对应creator编辑器的资源管理器</li>
<li>library 本地资源库,预览项目时使用的目录</li>
<li>build 构建后的项目默认目录</li>
</ul>
<p style="text-align: center;"><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-bcebb1be8959139399497da1691cc0a7"></p>
<p>在assets目录下,creator会为每个资源文件和目录生成一个同名的.meta文件,meta文件是一个json文件,记录了资源的版本、uuid以及各种自定义的信息(在编辑器的<code>属性检查器</code>中设置),比如prefab的meta文件,就记录了我们可以在编辑器修改的optimizationPolicy和asyncLoadAssets等属性。</p>
<p style="text-align: center;"><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-352381d2bbd404be9beeb162a604f34d"></p>
<div class="blockcode">
<pre class="brush:js;">
{
"ver": "1.2.7",
"uuid": "a8accd2e-6622-4c31-8a1e-4db5f2b568b5",
"optimizationPolicy": "AUTO", // prefab创建优化策略
"asyncLoadAssets": false, // 是否延迟加载
"readonly": false,
"subMetas": {}
}</pre>
</div>
<p>在library目录下的imports目录,资源文件名会被转换成uuid,并取uuid前2个字符进行目录分组存放,creator会将所有资源的uuid到assets目录的映射关系,以及资源和meta的最后更新时间戳放到一个名为uuid-to-mtime.json的文件中,如下所示。</p>
<div class="blockcode">
<pre class="brush:js;">
{
"9836134e-b892-4283-b6b2-78b5acf3ed45": {
"asset": 1594351233259,
"meta": 1594351616611,
"relativePath": "effects"
},
"430eccbf-bf2c-4e6e-8c0c-884bbb487f32": {
"asset": 1594351233254,
"meta": 1594351616643,
"relativePath": "effects\\__builtin-editor-gizmo-line.effect"
},
...
}</pre>
</div>
<p>与assets目录下的资源相比,library目录下的资源合并了meta文件的信息。文件目录则只在uuid-to-mtime.json中记录,library目录并没有为目录生成任何东西。</p>
<h3>1.2 资源构建</h3>
<p>在项目构建之后,资源会从library目录下移动到构建输出的build目录中,基本只会导出参与构建的场景和resources目录下的资源,及其引用到的资源。脚本资源会由多个js脚本合并为一个js,各种json文件也会按照特定的规则进行打包。我们可以在Bundle的配置界面和项目的构建界面为Bundle和项目设置</p>
<p style="text-align: center;"><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-da42949d3398c801c30cd69aab2167b0"></p>
<p>1.2.1 图片、图集、自动图集</p>
<ul>
<li>https://docs.cocos.com/creator/manual/zh/asset-workflow/sprite.html</li>
<li>https://docs.cocos.com/creator/manual/zh/asset-workflow/atlas.html</li>
<li>https://docs.cocos.com/creator/manual/zh/asset-workflow/auto-atlas.html</li>
</ul>
<p>导入编辑器的每张图片都会对应生成一个json文件,用于描述Texture的信息,如下所示,默认情况下项目中所有的Texture2D的json文件会被压缩成一个,如果选择<code>无压缩</code>,则每个图片都会生成一个Texture2D的json文件。</p>
<div class="blockcode">
<pre class="brush:js;">
{
"__type__": "cc.Texture2D",
"content": "0,9729,9729,33071,33071,0,0,1"
}</pre>
</div>
<p>如果将纹理的Type属性设置为Sprite,Creator还会自动生成了SpriteFrame类型的json文件。<br>
图集资源除了图片外,还对应一个图集json,这个json包含了cc.SpriteAtlas信息,以及每个碎图的SpriteFrame信息<br>
自动图集在默认情况下只包含了cc.SpriteAtlas信息,在勾选内联所有SpriteFrame的情况下,会合并所有SpriteFrame</p>
<p>1.2.2 Prefab与场景</p>
<ul>
<li>https://docs.cocos.com/creator/manual/zh/asset-workflow/prefab.html</li>
<li>https://docs.cocos.com/creator/manual/zh/asset-workflow/scene-managing.html</li>
</ul>
<p>场景资源与Prefab资源非常类似,都是一个描述了所有节点、组件等信息的json文件,在勾选<code>内联所有SpriteFrame</code>的情况下,Prefab引用到的SpriteFrame会被合并到prefab所在的json文件中,如果一个SpriteFrame被多个prefab引用,那么每个prefab的json文件都会包含该SpriteFrame的信息。而在没有勾选<code>内联所有SpriteFrame</code>的情况下,SpriteFrame会是单独的json文件。</p>
<p>1.2.3 资源文件合并规则</p>
<p>当Creator将多个资源合并到一个json文件中,我们可以在config.json中的packs字段找到被<code>打包</code>的资源信息,一个资源有可能被重复打包到多个json中。下面举一个例子,展示在不同的选项下,creator的构建规则:</p>
<ul>
<li>a.png 一个单独的Sprite类型图片</li>
<li>dir/b.png、c.png、AutoAtlas dir目录下包含2张图片,以及一个AutoAtlas</li>
<li>d.png、d.plist 普通图集</li>
<li>e.prefab 引用了SpriteFrame a和b的prefab</li>
<li>f.prefab 引用了SpriteFrame b的 |
|