如何使用bookmarklet修改Scratch项目中的变量值
Scratch 项目变量写入方案
核心实现思路
Scratch 3 运行时的虚拟机实例默认暴露在全局上下文,不需要通过已被移除的 Blockly 相关接口操作,直接操作虚拟机实例即可完成变量读写,性能和稳定性都远优于 DOM 读写方案。
操作步骤
1. 获取虚拟机实例
运行以下代码拿到当前页面的 Scratch 虚拟机对象,兼容直接打开的 Scratch 项目页面和内嵌 iframe 加载的项目:
const vm = window.vm ?? Array.from(document.querySelectorAll('iframe')).find(iframe => iframe.contentWindow?.vm)?.contentWindow.vm;
返回值不为空即为获取成功。
2. 修改变量值
修改全局(舞台)变量
全局变量归属于舞台对象,示例代码如下:
// 找到舞台实例 const stage = vm.runtime.targets.find(target => target.isStage); // 按变量名查找对应变量对象,替换「你的变量名」为实际的Scratch变量名 const targetVariable = Object.values(stage.variables).find(item => item.name === '你的变量名'); // 写入新值,支持数字、字符串等Scratch支持的变量类型 if (targetVariable) targetVariable.value = '你需要写入的内容';
写入完成后Scratch的变量监视器会自动同步更新,项目内的积木可以直接读取到修改后的值。
修改角色私有变量
如果要操作的是角色私有变量,先找到对应角色实例再执行变量查找即可:
// 按角色名查找实例,替换「你的角色名」为实际的角色名称 const roleTarget = vm.runtime.targets.find(target => target.sprite.name === '你的角色名'); // 后续变量查找和写入逻辑和全局变量一致 const targetVariable = Object.values(roleTarget.variables).find(item => item.name === '你的变量名'); if (targetVariable) targetVariable.value = '要写入的内容';
注意事项
- 变量名大小写敏感,查找时需要和Scratch项目内设置的变量名完全匹配
- 该方案仅适用于Scratch 3.x版本的项目,不兼容旧版Scratch 2.0项目
内容的提问来源于stack exchange,提问作者themirrazz
相关产品推荐
相关产品推荐

