蒼水技術録

蒼水家技術録

蒼水が普段制作とか勉強とかして覚えたことを復習としてまとめてるものです。 それが最適解かどうかはわからないけど、何を目的として始めて、何が必要で、実際何をやって、どうなったか、まで全部過程を残すための技術ブログです。

Blender アドオン編 #1 -アドオン開発勉強記録 第1回-

どうも蒼水です。
先月からBlenderでアドオンを開発すべく、こちらのページを参考にしつつ勉強を進めております。
いつかTA(テクニカルアーティスト)のような何かになりたい(願望)

最高なので興味ある方は是非読みましょう...!
https://colorful-pico.net/introduction-to-addon-development-in-blender/2.8/index.html

今回の目的

Blenderアドオン編では復習がてら自分で咀嚼したものを個人的にまとめなおして理解を深める目的で進めていきます。
序盤ではその通り上記で紹介した記事を参考に自分が勉強した内容を自分なりに咀嚼して書いていきます。
一通り学び終え、中盤以降では改造から始め自分のオリジナルでアドオンを開発するまでに至れればなと思っております。

そもそもアドオンとは?

BlenderにおけるアドオンとはBlenderのデフォルトではない機能を拡張して使うためのもの、という感じでしょうか。
BlenderPythonで開発されており、また各種APIも公開されているためこれらを利用してアドオンを開発することができるようになっています。
docs.blender.org
とはいえ全部英語であること&物量が半端ない、という感じで全部見ていくのは結構キツイですね...。
ので、先ほどのようなページを用意してくださっている方には感謝極まりないです。ありがたい...。

f:id:Yui_Aomi:20200301190358p:plain
アドオンのON/OFF
こんな感じで【編集->プリファレンス->アドオン】からON/OFFできます。
インストール方法は直接アドオンのフォルダにぶち込む方法と、Zipからインストールする方法がありますがこれに関しては割愛します。

アドオン開発の準備

前述の通りBlenderのアドオン開発にはPythonを使ってコーディングしていく必要があります。
そのために開発環境が必要になるわけですが、Blender公式でしっかりコーディング用の機能を用意してくれています。
上部のタブの中にあるScriptingというものがあるのでこれを選択するとこのような画面になります。

f:id:Yui_Aomi:20200301185311p:plain
Blenderの開発環境
開発に必要なテキストエディタ、コンソール、オートコンプリートの機能も備わっており開発するには十分かと思いますのでこれを使用していくため特に準備は不要です。

▼オートコンプリート(自動補完機能)に関して
Visual Studioを普段使っているのでインテリセンスが欲しくてたまらないんですよね....
Blenderにも一応それに近い機能があるのですが、自動では表示してくれないので上部【メニュー->編集->オートコンプリート】をしてやる必要があります。
ショートカットは【Ctrl+Space】なので基本これを使っていくことで快適にコーディングが行えるようになります。

f:id:Yui_Aomi:20200301190557p:plain
オートコンプリートに関して

一点注意点としては、どうもこのオートコンプリート、VSのようにモジュールが全て読み込まれていてそこから候補を出してくれるというものではないらしく自分が今書いているスクリプト内で使われた関数や変数を候補として出してくれる機能らしいです。そこまでで出てこなかったモノ、インポートしたbpyモジュールなどからの候補は上げてくれないらしいです。
そこは少し不便ですが最初一回書けば後は補完してくれるのでないよりマシかな、というくらいですかね。

そこまで気にならなければこのエディタで、いやインテリセンス欲しい!ってなったらVS使うのがいいかな~くらいに自分は思っております。

Blenderアドオンのおまじない要素

アドオンを開発していくにあたって必ず必要になる要素に関して書いていきます。

bl_info

これはアドオンを認識させるために基本的な情報を辞書型で列挙しておくためのものですね。
主にプリファレンスに表示されるために必要になる部分です。
こんな感じで列挙します。

bl_info = {
    "name": "サンプル",
    "author": "Yui_Aomi",
    "version": (1, 0),
    "blender": (2, 80, 0),
    "location": "追加→メッシュ",
    "description": "サンプルアドオン",
    "warning": "機能はありません",
    "support": "TESTING",
    "wiki_url": "sample",
    "tracker_url": "sanmple",
    "category": "Object"
}

それぞれが以下のように対応します。
f:id:Yui_Aomi:20200301192446p:plain

なお、blenderは対応するblenderのバージョン
supportはプリファレンス上部にある【公式】【コミュニティ】【テスト中】のどれかを認識するためにそれぞれ
【公式】→OFFICIAL
【コミュニティ】→COMMUNITY
【テスト中】→TESTING

と指定すればそれぞれで認識されます。
開発中はTESTINGに、完成したらCOMMUNITYにする感じの運用になるかなと思います。


register

これはプリファレンスからアドオンを有効にするために必ず必要になる関数になります。
アドオンを有効化する際に呼ばれアドオンの登録やコンソールへの出力などを行います。

def register():
    print("サンプルアドオンが有効になりました")

今回はメニューや実際実行される関数はないためコンソールに文字列を表示させるためだけのものです。
今回はありませんが機能が追加してclass等が出てきた場合それらを登録していくのがこの部分になります。

unregister

これは逆にアドオンを無効にするために必ず必要になる関数です。
こちらも同様に今回は文字列の表示のみになります

def unregister():
    print("サンプルアドオンが無効になりました")
メイン処理

これはもはや慣習的なものでとりあえず書いとけなまさにおまじないです。
エディタ上部のテキスト->スクリプトを実行で呼ばれる関数です。
アドオンの場合必要ない部分なのでregisterだけ呼んでいます。
何かしら拡張してアドオンとしてではなく一時的に何か動作させる場合は自分で定義した関数などを呼べば【テキスト->スクリプトを実行】一時的に実行することができるものかと思われます(試していないため不明)

if __name__ == "__main__":
    register()

コード全体

bl_info = {
    "name": "サンプル",
    "author": "Yui_Aomi",
    "version": (1, 0),
    "blender": (2, 80, 0),
    "location": "追加→メッシュ",
    "description": "サンプルアドオン",
    "warning": "機能はありません",
    "support": "TESTING",
    "wiki_url": "sample",
    "tracker_url": "sanmple",
    "category": "Object"
}


def register():
    print("サンプルアドオンが有効になりました")


def unregister():
    print("サンプルアドオンが無効になりました")


if __name__ == "__main__":
    register()

このコードで最低限アドオンのON/OFFができるだけのものが出来上がります。機能はありません。
他にも必ず必要になるオペレータークラスとexecuteやmenu_fnなどがありますが、これらは次回に回します。

まとめ

最低限【bl_info】【register】【unregister】とメイン処理部分があればアドオンのような何かをBlenderで動作させることができるようになるらしい。
次回はこのON/OFFだけできるようになったコードに機能を追加していき、もう少しアドオンっぽい何かにして行きます。

次回
atelier-aomi.hatenablog.com