乐于分享
好东西不私藏

Blender插件开发全面教程

Blender插件开发全面教程

这是一份为你准备的 Blender 插件开发从零基础到入门的全面教程。即使你完全没有编程经验,借助AI工具(如ChatGPT或DeepSeek,Kimi,豆包)和这份指南,也能快速上手。

第一章:出发前的准备

在写第一行代码前,我们需要先把“工具箱”和“环境”准备好。正确的环境配置能让开发过程事半功倍。

1.1 必备知识

Blender 基础操作:知道如何移动物体、添加修改器、使用面板。

Python 基础:如果你完全不会 Python,建议花 30 分钟看一遍基础语法(变量、列表、循环、函数)。借助 AI,你可以直接问“用 Python 写一个循环遍历列表”来快速学习 。(点击这里-零基础学习Python)

1.2 环境配置

为了更容易排查错误,我们需要让 Blender 把“后台报错”显示出来:

1. 打开系统控制台:

 • Windows:打开 Blender,点击顶部菜单 窗口 -> 切换系统控制台。这会弹出一个黑色的命令行窗口,代码报错会显示在这里。

 • Mac:需要在应用程序文件夹中找到 Blender,右键选择“显示包内容”,进入 Contents/MacOS 双击运行 Blender 来启动终端 。

2. 开启开发者选项:

•进入 编辑 -> 偏好设置 -> 界面

•勾选 显示开发人员选项。这会在右键菜单中增加“编辑源码”等便捷功能 。

3. 选择代码编辑器:

方案A(新手推荐):Blender 自带的 文本编辑器 工作区。可以直接运行脚本,非常简单。

方案B(专业):VS Code。配合 Blender Development 插件,可以实现代码补全和一键发送代码到 Blender 执行 。


第二章:第一个插件

任何插件都需要一个“身份证”和基本的“开关”逻辑。

2.1 插件的最简结构

在 Blender 的文本编辑器中,输入以下代码。这是一个什么功能都没有,但能被 Blender 识别为插件的空壳:

bl_info = {    “name”: “我的第一个插件”,    “author”: “你的名字”,    “version”: (10),    “blender”: (42, 0),    “location”: “View3D > UI”,    “category”: “Object”,}import bpydef register():    print(“插件已启用,你好!”)def unregister():    print(“插件已禁用,再见!”)if __name__ == “__main__”:    register()

代码详解:

bl_info:这是一个字典,告诉 Blender 插件叫什么、作者是谁、最低支持哪个版本。注意:在 Blender 4.2 及以上版本,虽然也支持这种方式,但官方推荐转为扩展格式(需要 blender_manifest.toml 文件)。

register:当你勾选启用插件时,会运行这里的代码。

unregister:当你取消勾选禁用插件时,会运行这里的代码。

2.2 运行与安装

1. 在文本编辑器里点击 运行脚本 按钮。

2. 由于我们没有实际安装,仅仅运行脚本不会看到插件出现在偏好设置里。

3. 正式安装:将上述代码保存为 .py 文件(例如 my_first_addon.py)。然后进入 编辑 -> 偏好设置 -> 插件 -> 安装,选择你的文件,勾选启用 。


第三章:添加功能(操作符 Operator)

插件里最核心的是 Operator(操作符),它代表用户点击按钮后执行的动作。

3.1 案例:一键移动物体

我们来实现一个让所有选中的物体沿 X 轴移动 1 米的按钮。

import bpy# 1. 定义一个操作符类class MOVE_OT_my_operator(bpy.types.Operator):    “””提示信息:鼠标悬停时会显示这个文档字符串”””     bl_idname = “object.my_move_operator”  # 唯一标识符,用于调用    bl_label = “向右移动一格”              # 界面显示的名字    bl_options = {‘REGISTER’, ‘UNDO’}     # 支持撤销    # 2. 执行函数:点按钮时触发    def execute(self, context):        # 获取当前选中的物体        for obj in context.selected_objects:            # 修改位置            obj.location.x += 1.0        # 返回成功信号        return {‘FINISHED’}# 3. 注册与注销def register():    bpy.utils.register_class(MOVE_OT_my_operator)def unregister():    bpy.utils.unregister_class(MOVE_OT_my_operator)if __name__ == “__main__”:    register()

如何调用:

临时调用:按F3打开搜索菜单,输入 “向右移动一格”,回车执行。

添加按钮:如果想在侧边栏加个按钮,需要在register函数中添加面板代码(见第四章)。


第四章:添加界面(面板 Panel)

插件通常需要放在侧边栏(按N键呼出)里方便点击。

4.1 创建自定义面板

结合上面的操作符,我们创建一个面板来放按钮。

import bpy#假设上面的操作符类 MOVE_OT_my_operator 已经定义好了class VIEW3D_PT_my_panel(bpy.types.Panel):    bl_label = “我的工具集”    bl_idname = “VIEW3D_PT_my_panel”    bl_space_type = ‘VIEW_3D’    # 显示在 3D 视图中    bl_region_type = ‘UI’        # 显示在侧边栏    bl_category = “我的工具”      # 侧边栏的标签页名称    def draw(self, context):        layout = self.layout        # 创建一个按钮,点击后运行我们的操作符        layout.operator(“object.my_move_operator”)# 注册时要同时注册面板和操作符def register():    bpy.utils.register_class(MOVE_OT_my_operator)    bpy.utils.register_class(VIEW3D_PT_my_panel)def unregister():    bpy.utils.unregister_class(VIEW3D_PT_my_panel)    bpy.utils.unregister_class(MOVE_OT_my_operator)if __name__ == “__main__”:    register()


第五章:让插件更专业(属性与配置)

我们不能让总数固定为 10。我们需要添加一个滑块,让用户在界面里调整数值。

5.1 添加属性

属性需要定义在bpy.types.PropertyGroup里,然后挂在 Blender 的某个数据结构上(比如场景)。

# 1. 定义属性组class MyProperties(bpy.types.PropertyGroup):    my_int: bpy.props.IntProperty(        name=“阵列数量”,        default=5,        min=1,        max=100    )    my_float: bpy.props.FloatProperty(        name=“移动距离”,        default=1.0,        subtype=‘DISTANCE’  # 显示为距离单位    )# 2. 在注册时,将这个属性组挂载到 bpy.types.Scene 上def register():    bpy.utils.register_class(MyProperties)    bpy.types.Scene.my_tool_props = bpy.props.PointerProperty(type=MyProperties)def unregister():    del bpy.types.Scene.my_tool_props    bpy.utils.unregister_class(MyProperties)# 3. 在面板中显示这个滑块class VIEW3D_PT_my_panel(bpy.types.Panel):    # … (上面的代码)    def draw(self, context):        layout = self.layout        props = context.scene.my_tool_props  # 获取属性        # 添加滑块        layout.prop(props, “my_int”)        layout.prop(props, “my_float”)        layout.operator(“object.my_move_operator”)# 4. 在操作符中使用属性class MOVE_OT_my_operator(bpy.types.Operator):    def execute(self, context):        props = context.scene.my_tool_props        total = props.my_int        distance = props.my_float        for obj in context.selected_objects:            obj.location.x += distance        return {‘FINISHED’}


第六章:Blender 4.2 的新变化(扩展 Extensions)

从 Blender 4.2 开始,官方推荐使用扩展格式。如果你的插件是给 4.2 及以上版本用的,建议采用这种结构 。

6.1 文件结构

你不能再只有一个.py文件了,需要是一个文件夹,包含清单文件和代码:

my_awesome_addon/├── blender_manifest.toml   # 替代 bl_info└── __init__.py             # 主代码文件

6.2 清单文件内容

blender_manifest.toml 的内容如下:

id “my_awesome_addon”

name = “我的超强插件”

maintainer = “你的名字”

type = “add-on”

version = “1.0.0”

blender_version_min = “4.2.0”

tagline = “这是一行简短的描述”

6.3 代码文件 __init__.py

代码结构基本不变,但需要注意相对导入和 __package__ 的使用 。

import bpydef register():    print(“扩展已加载”)def unregister():    print(“扩展已卸载”)


第七章:借助 AI 助手开发

这是你最大的优势。不要死记硬背 API,要学会和 AI 对话。

7.1 提问技巧

当你需要实现某个功能时,直接向 AI 提问:

•“在 Blender Python 中,如何获取当前选中的物体?”

•“写一段代码,创建一个立方体并把它移动到游标位置。”

•“如何在 Blender 插件中创建一个枚举下拉菜单?”

7.2 借助 AI 调试

如果代码报错,直接把红色报错信息和代码复制给 AI:

“我运行这段代码时出现了 AttributeError: ‘NoneType’ object has no attribute ‘location’,为什么?”

AI 会告诉你:“你没有检查当前是否有活动物体,如果场景是空的就会报错。请加上 if context.active_object is not None:。”

7.3 让 AI 写完整代码

你可以像这样给 AI 下指令:

“请帮我写一个 Blender 插件,功能是:在 3D 视图的侧边栏添加一个面板,面板里有一个‘生成随机立方体’按钮。每次点击按钮,就在 3D 游标位置生成立方体,且立方体的大小随机在 0.5 到 2.0 之间。”


第八章:调试与发布

8.1 调试技巧

打印变量:在代码里加print(变量名),结果会显示在之前打开的系统控制台里 。

重载脚本:开发时,修改代码后不需要重启 Blender。在文本编辑器里点击运行脚本按钮即可重新加载 。

8.2 打包与发布

1. 打包为 .zip:

旧版插件:直接把 .py 文件压缩成 zip。

新版扩展:把整个文件夹压缩成 zip。

2. 发布:可以在 Github 上分享,或者上传到 Blender 官方的扩展平台。


总结

恭喜你,你已经完成了从 0 到 1 的跨越。回顾一下核心要点:

1.结构:记住bl_info + Operator + register三板斧。

2.交互:通过Panel放按钮,通过 Property 存数值。

3.借助AI:这是现代开发者的必备技能,让 AI 帮你生成模板代码和调试错误。

4.版本:Blender4.2以上记得用blender_manifest.toml 。

开始动手写你的第一个插件吧,哪怕只是让立方体动一下,也足以让你感受到创造的乐趣。如果在开发中遇到具体问题,记得随时向 AI 求助!