适用于blender≥4.5.0
bpy.app.handlers
https://docs.blender.org/api/current/bpy.app.handlers.html#bpy.app.handlers.depsgraph_update_post
如加载文件等hooks可以用这个。
def on_update(scene, depsgraph): ... # 监听依赖图更新
def register():bpy.app.handlers.depsgraph_update_post.append(on_update)
def unregister():bpy.app.handlers.depsgraph_update_post.remove(on_update)
bpy.msgbus.subscribe_rna
https://docs.blender.org/api/current/bpy.msgbus.html#bpy.msgbus.subscribe_rna
当app.handers无效时使用。频繁会变动的属性(如当前选择的物体active_obj)就会用到这个。
OWNER = object()
def on_change(): ...
def register():# 使用消息总线监听活动对象的更改bpy.msgbus.subscribe_rna(key=(bpy.types.LayerObjects, "active"),owner=OWNER,args=(),notify=lambda: on_change())def unregister():bpy.msgbus.clear_by_owner(owner)
bl_ui.space_toolsystem_common.item_from_id.handlers.set.append
https://archive.blender.org/developer/D10635
modal()
最复杂,最灵活,且modal在持续运行时会禁用自动保存。我用modal()+yield Gernator实现了一个暂停可恢复的Operator,用于耗时操作(如fk转ik)
class Operator(bpy.types.Operator):def modal(self, context):...