版本: 3.5.0
OS: macOS 12.3.1
通过 编辑器 > 扩展 > 创建扩展 生成的示例代码, 编译-加载-启用后, builder.js / hooks.js 都执行了, 唯独 asset-handlers.js 无论如何也不执行.
是否因为官方加了个 ‘自定义压缩方式‘ 这个试验功能, 把原来 compressTextures API 忽略了?
版本: 3.5.0
OS: macOS 12.3.1
通过 编辑器 > 扩展 > 创建扩展 生成的示例代码, 编译-加载-启用后, builder.js / hooks.js 都执行了, 唯独 asset-handlers.js 无论如何也不执行.
是否因为官方加了个 ‘自定义压缩方式‘ 这个试验功能, 把原来 compressTextures API 忽略了?
中午鬼使神差, 不知道为啥终于执行 asset-handlers 了.
结果, 现在又只执行旧代码 不管是重编译, 清缓存, 重加载都无效 !!
到底是什么逻辑哦…
不执行具体是指哪个方法不执行?这个:compressTextures?
当然是指这个文件没有被导入执行了(比如顶层 console.log 没输出) .
不过重启编辑器 + Dashboard 似乎能加载了(刷新扩展没用, 每改一行都要这样). 更多的问题却在后面,
删除一个扩展后, 构建仍会继续运行缓存的扩展代码 (清理和重启也无效, 后来才发现, 必须重新创建一个构建配置) .
文件 useCompressTexture 参数不够灵活, 比如要用 pngquant, 光一个 10-100 的数字不足以描述需求.
默认模板 (项目>新建构建扩展包) 逻辑有缺陷:
export const compressTextures: AssetHandlers.compressTextures = async (tasks) => {
// ?? 沿用模版的代码, 总是有些文件被跳过 猛然发现竟然是这样写的!
for (let i = 0; i < Array.from(tasks).length; i++) {
const task = Array.from(tasks)[i];
//...
tasks.splice(i, 1);
}
这个我这边测试是正常的,如果有压缩纹理缓存,没触发重新压缩的情况下是不会触发的;
这个是指的刷新插件?如果是的话,在插件代码重新生成后,可以在构建调试面板 ctrl+r 进行刷新;
这个没复现。
比如?是指有怎样的问题?
我相信你能在日志中能找到已删除的扩展名字…
下面不是放了代码么.
经典边迭代边删除元素, 导致部分元素被跳过.
const tasks = [1,2,3,4]; //example
// 这2个 Array.from 应该是替换变量失误了吧
for (let i = 0; i < Array.from(tasks).length; i++) {
const task = Array.from(tasks)[i];
console.log(task);
tasks.splice(i, 1);
}
> 1,3
之前我就到问题是插件脚本 require 的文件不会随着重启Creator而释放,
// test.js
let ToolsApi= require('ToolsApi.js')
// 测试Dome
// test.js 重启Creator后
// 重启Creator或从商店下载该插件更新后,ToolsApi 脚本缓存仍然没清除
// 导致就算修改了 ToolsApi 脚本内容,require函数仍然导入的是旧对象
let tempToolsApi == require.cache['ToolsApi.js']
let ToolsApi= require('ToolsApi.js')
if(tempToolsApi == ToolsApi) {}// 同个对象
现在我插件每次启动前都要调用这方法清除所以脚本缓存,防止更新出错。既然有人也遇到这问题我再提一次反馈
// 临时解决方法,插件入口调用该函数清除缓存
function clearRequireCache(){
if(require.cache){
// console.log("清除脚本缓存")
for (const key in require.cache) {
if(key.includes('插件包名') ){
delete require.cache[key];
}
}
}
}
这个只是你编程基础没学好导致的问题
Excuse me?
这不是我的代码… 这是 “构建扩展模板” 的代码, 我在这反馈问题呢.
好吧,抱歉,那就是写出这代码的是菜鸟