blender-addon-development について
Blender 拡張機能の開発、テスト、ビルド、公開を案内するスキルです。アドオン開発者向けに、テンプレートを使った手順と、現行 API や拡張機能の要件を説明します。
主な機能
- 01検証済みアドオンテンプレートの利用
- 02拡張パッケージの検証とビルド
- 03ヘッドレスでのオペレーターテスト
- 04マニフェスト、権限、wheel の設定
- 05登録、UI、公開の手順
活用シーン
- 01新しい Blender 拡張パッケージの作成
- 02UI を開かずにオペレーターをテスト
- 03extensions.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 にあります。CI で検証、ビルド、登録済みの assets/addon_template/ から始めます。内容は 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 を使用する場合は、より高いバージョンを指定します(例:GN のproperties.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してはいけません。プラットフォーム固有のホイールには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)のペアを保存して、登録解除時に削除します。 - 翻訳/i18n:
bpy.app.translations.register(__package__, dict)を使用します。
公開(extensions.blender.org)
Blender ID アカウントからビルド済みの zip をアップロードします。要件は、有効なマニフェスト、GPL と互換性のあるライセンス、難読化されていないコード、ソースなしのバイナリを同梱していないこと、および権限の宣言です。スクリーンショットと README はウェブサイトの掲載ページに追加します。更新時は version をより高い値にします。
注意点
- 描画関数内の
context.sceneは、一部のエディターではNoneになることがあります。ガードしてください。 - Blender データ参照(
bpy.types.ID)を Python のグローバル変数に保存すると、Undo やファイルの読み込み後にクラッシュします。名前またはsession_uidを保存し、再度検索してください。 - プロパティのアノテーションで
:の代わりに=を使うと、bpy.utils.register_classは失敗します。 - 5.0 では、複数の同梱モジュール(
rna_info、bl_ui_utilsなど)が非公開になりました。インポートしないでください。 - 5.1 では、ユーザーの site-packages がデフォルトで読み込まれなくなりました。ユーザーによるインストールに依存せず、wheel を同梱してください。
- 5.2:
PreferencesFilePaths.active_asset_libraryのインデックスはずれています(「All」/「Essentials」の項目が先にあります)。UILayout.template_palette(color=)は削除されました。新機能:UILayout.link、UILayout.textbox、bpy.data.all_ids、Window.screenshot。
コメント
Markdown 対応