告别微信小游戏启动场景黑屏,分享一个内置资源打包插件

2.1.4可用! 感谢楼主的脚本

是因为打包没勾选md5加密吧?

这个吗 ,有勾选

更新了下引擎 2.2 倒是可以

请问是什么版本的引擎呢?

看了一下2.0.10的Creator构建出来确实没有_md5Map这个属性,不好意思没做旧版本的兼容。旧版本的引擎如果没有带有material材质系统建议按这个官方教程去做 通过加载界面优化微信小游戏启动速度 ,直接读取本地资源,这样会少一些配置文件更节省空间。

如果引擎版本带有材质系统就可以用这个插件去打包

不太懂他的构建过程。 大概看了下 _md5Map 里面的数据 大概就是 { uuid: md5 …}, 如果知道 新版本的 _md5Map 数据生成的方法是不是就可以兼容? 顺便问下大佬,哪里能了解到引擎构建这部分的过程。是否有开源?

我有个思路,在onBeforeBuildFinish的时候所有文件名都只是【uuid+格式】还没有md5,这个时候可以使用第三方库获取这些文件的md5值,最后在onBuildFinish的时候用【uuid+md5+格式】作为路径拷贝资源

还没实践过,你可以试试:grin:

堆栈有死循环

2.2.2
我的资源比较多
会造成堆栈溢出
可能是插件堆栈代码死循环了

我qq 339385266 方便交流

https://github.com/dylan465/plugin_internal_res_packer/commit/96fcd624d302222145d70b112c76c5948fce8bcc

2.1.3版本构建失败 报错信息:
62/62de3fde-45e2-4c0a-9770-3158ec028d74.dac95.ttf’
at fs.statSync (fs.js:973:11)
at Object.fs.statSync (ELECTRON_ASAR.js:298:16)
at Object.statSync (/Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/graceful-fs/polyfills.js:308:16)
at Object.copySync (/Applications/CocosCreator.app/Contents/Resources/app.asar/node_modules/fire-fs/node_modules/fs-extra/lib/copy-sync/copy-sync.js:21:84)
at copyFile (/Users/chengyoung/miniprogram/packages/plugin_internal_res_packer/main.js:51:6)
at copyAssetByUuid (/Users/chengyoung/miniprogram/packages/plugin_internal_res_packer/main.js:81:6)
at copyAssets (/Users/chengyoung/miniprogram/packages/plugin_internal_res_packer/main.js:92:6)
at copyAssets (/Users/chengyoung/miniprogram/packages/plugin_internal_res_packer/main.js:96:36)
at onBuildFinish (/Users/chengyoung/miniprogram/packages/plugin_internal_res_packer/main.js:124:3)
at /Applications/CocosCreator.app/Contents/Resources/app.asar/editor-framework/lib/share/polyfills.js:1:286
errno: -2,
code: ‘ENOENT’,
syscall: ‘stat’,
path: ‘/Users/chengyoung/miniprogram/build/wechatgame/res/raw-assets/62/62de3fde-45e2-4c0a-9770-3158ec028d74.dac95.ttf’ }
at then.e (/Applications/CocosCreator.app/Contents/Resources/app.asar/editor/lib/builder/index.js:1:885)
at
at process._tickDomainCallback (internal/process/next_tick.js:135:7)

看了下这里的字体文件是放在文件夹下面的


是因为这个原因导致构建失败的吗 要怎么修改一下呢

十分抱歉,ttf字体文件的构建后的路径有点特殊,晚点我会修复。
不过建议在启动场景不要引用ttf字体,因为会占用不少空间,毕竟只有宝贵的4M

666
2.2.2 可用
不过若是自己项目已经有一个定制构建的插件了,可能还得分个目录,不然怎么也识别不了,例如

这里可能会放版本号什么的

mark

只要我场景 嵌套了 一个 预制体 就会报错

Exception RangeError: Maximum call stack size exceeded

希望 题主 早日修复 !

我把自己的修改源码贴一下吧 onBuildFinish 方法 稍微修改 防止死循环的

function onBuildFinish(options, callback) {

let buildResults = options.buildResults;
let uuidList = [],myependUuids = [];

if (options.actualPlatform === 'wechatgame' && !options.debug && options.md5Cache) {
	function copyAssetByUuid(uuid) {
		let md5Array = getMd5ByUuidArray(buildResults, uuid);
		if (md5Array && md5Array.length > 0) {
			let srcArray = getFilePathArray(buildResults, Path.join(options.dest, 'res'), uuid, md5Array);
			let dstArray = getFilePathArray(buildResults, Path.join(options.dest, 'res_internal'), uuid, md5Array);
			for (let index = 0; index < srcArray.length; index++) {
				const src = srcArray[index];
				const dst = dstArray[index];
				copyFile(src, dst);
			}
		}
		uuidList.push(uuid);
	}

	function copyAssets(uuids) {
		myependUuids.push(uuids);
		for (let i = 0; i < uuids.length; ++i) {
			let uuid = uuids[i];
			let asset = buildResults._buildAssets[uuid];
			if (asset && buildResults.getAssetType(uuid) != 'folder') {

				if(uuidList.indexOf(uuid)==-1){
					copyAssetByUuid(uuid);
				}

				// 依赖数据
				let asset = buildResults._buildAssets[uuid];
				if(asset && asset.dependUuids&&myependUuids.indexOf(asset.dependUuids)==-1){
					copyAssets(asset.dependUuids); // 递归依赖
				}
				// 合并数据
				let packedUuid = getUuidFromPackedAssets(buildResults, uuid);
				if(packedUuid&&uuidList.indexOf(packedUuid)==-1){
					copyAssetByUuid(packedUuid);
				}
			}
		}
	}

	function queryAssets(dbPath) {
		Editor.assetdb.queryAssets(dbPath, null, (err, assetInfos) => {
			if (!err) {
				let array = assetInfos.map(x => x.uuid);
				copyAssets(array);
			}
		});
	}

	// 打包引擎内置的effects和materials
	queryAssets('db://internal/resources/**/*');

	// 打包启动场景资源

	// 方法1:读路径
	// queryAssets('db://assets/Scene/LaunchScene.fire');

	queryAssets('db://assets/scene/loading.fire');

	// 方法2:读配置
	var startSceneUuid = options.startScene;
	copyAssets([startSceneUuid]);

}
callback();

}`

厉害!总算有时间回来改bug了,现在github上面更新了,感谢支持:p