关于 blender-addon-development
指导 Blender 扩展开发、测试、构建和发布的技能。面向制作插件的开发者,提供基于模板的流程,并说明当前 Blender API 和扩展要求。
主要功能
- 01从经过验证的插件模板开始
- 02验证并构建扩展包
- 03无界面操作符测试指南
- 04清单、权限和 wheel 配置
- 05注册、UI 与发布指引
适用场景
- 01搭建新的 Blender 扩展包
- 02不打开界面测试操作符
- 03准备在 extensions.blender.org 发布
- 04将插件更新到较新的 Blender API
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ blender-skills --skill blender-addon-development安装后在 Claude Code 中输入/blender-addon-development确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/addon_template/__init__.pyblender_manifest.tomloperators.pyui.py详细介绍
插件(扩展)开发
执行模型位于 blender-core 中。请从 assets/addon_template/ 开始(已在 CI 中验证、构建和注册):blender_manifest.toml、__init__.py、operators.py、ui.py。
流程
- 复制模板,然后设置
id(小写字母加下划线,永久不变)、name、tagline(末尾不加句号,≤ 64 个字符)、maintainer、version(semver)、license(SPDX;使用 bpy 的代码须采用 GPL-3.0-or-later),以及blender_version_min = "4.2.0";如果使用更新的 API,则设为更高版本(例如,使用 GNproperties.inputsAPI 时设为"5.2.0")。 - 按照前缀约定为类命名:
MYTOOL_OT_x(操作器)、_PT_(面板)、_MT_(菜单)、_PG_(属性组)、_AP_(首选项)、_UL_(UI 列表)。操作器的bl_idname格式为my_tool.verb_noun。 - 验证并构建:
blender --command extension validate ./my_tool blender --command extension build --source-dir ./my_tool --output-dir ./dist blender --command extension install-file -r user_default -e ./dist/my_tool-1.0.0.zip - 进行无头测试:在进程内注册该包,使用
temp_override调用操作器,并断言数据(参见本仓库中的tests/test_addon.py)。
规则(扩展时代,5.x)
- 仅使用相对导入(
from . import ops)。包名由 Blender 决定,因此首选项应使用bl_idname = __package__。 - 不要使用
bl_info(扩展会忽略它)。所有信息都应放入清单中。 - 导入/注册时不得访问网络或文件。 声明
[permissions](files、network、clipboard、camera、microphone)并说明原因。进行任何网络调用前,先检查bpy.app.online_access。 - 第三方 Python 包:将
.whl文件放入./wheels/,并在wheels = [...]中列出。运行时不得使用pip install。平台专用 wheel 需要设置platforms = [...]。 - 属性(5.0+):
bpy.props值是属性,而不是字典条目(scene["my_prop"]不再能访问这些值)。只读属性请使用options={'READ_ONLY'}。get_transform/set_transform在保留存储方式的同时转换值。通过 ID 类型上的PointerProperty(type=PG)注册,并在注销时将其del掉。 - 操作器:设置
bl_options={"REGISTER","UNDO"},以支持撤销和重做面板。使用poll()检查上下文。返回{"FINISHED"}/{"CANCELLED"}。使用self.report({"WARNING"}, msg)向用户反馈。如果存在数据 API,不要在循环中调用其他操作器。 - UI:
layout.use_property_split = True可实现现代化对齐。N 面板中的面板使用bl_region_type="UI"+bl_category。使用VIEW3D_MT_*.append(func)添加菜单项,并在注销时移除。 - 按相反顺序注销所有内容(类、属性、菜单、处理器、计时器、快捷键映射、绘制处理器)。泄漏会导致重新加载失败。
- 绘制(叠加层):使用
gpu模块和gpu_extras.batch。bgl已在 5.0 中移除。纹理通过gpu.texture.from_image(img)获取。对于场景线性图像,使用draw_texture_2d(..., is_scene_linear_with_rec709_srgb_target=True)。 - 长时间任务:使用带计时器的模态操作器(
wm.event_timer_add),或使用bpy.app.timers.register分块处理。不要让 UI 卡顿数秒。 - 处理器:为持久处理器添加
@bpy.app.handlers.persistent装饰器。保持处理器开销低(它们会在每帧/每次 depsgraph 更新时运行)。 - 快捷键映射:将其添加到
wm.keyconfigs.addon,保存(km, kmi)对,并在注销时移除。 - 翻译/国际化:
bpy.app.translations.register(__package__, dict)。
发布(extensions.blender.org)
Blender ID 账户会上传构建好的 zip。要求:清单有效、许可证与 GPL 兼容、代码未混淆、不捆绑无来源的二进制文件,并且已声明权限。截图/README 放在网站列表页面上。更新时使用更高的 version。
注意事项
- 在某些编辑器中,绘制函数里的
context.scene可能是None。请进行保护。 - 在 Python 全局变量中存储 Blender 数据引用(
bpy.types.ID)会在撤销操作或加载文件后导致崩溃。请存储名称或session_uid,并在需要时重新查找。 - 如果属性注解使用
=而非:,bpy.utils.register_class会失败。 - 5.0 将若干捆绑模块设为私有模块(
rna_info、bl_ui_utils等)。不要导入它们。 - 5.1 起,默认不再加载用户的 site-packages。请捆绑 wheels,而不要依赖用户安装的包。
- 5.2:
PreferencesFilePaths.active_asset_library的索引存在偏移(会先列出“All”/“Essentials”条目)。UILayout.template_palette(color=)已移除。新增:UILayout.link、UILayout.textbox、bpy.data.all_ids、Window.screenshot。
评论
支持 Markdown