graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

Maya の .NET プラグインがアンロードできない問題を強引に解決してみた

hal1932/MayaWpfTest · GitHub

いちおう自分で納得できる範囲で解決したということで。


基本的な方針としては、

  • アンロードできないなら、そもそもロードしなければいい
  • MVVM において V-VM と M を分離するのは自然な発想、M を言語レベルで分離すればいい

というあたり。


C# から Maya を操作するために、TCP 経由で C#/Maya のやりとりをする。たぶん似たようなことやった人はたくさんいるんだと思う。それを WPF と Maya 上の Python とでやってみた。

Python 側では

  1. C# の .exe を起動する
  2. TCP を開いて C# の .exe と通信する
  3. MVVM における Model を定義する

C# 側では

  1. MVVM における View-ViewModel を定義する

Python 側をデーモンとして動作させて、C# 側と通信しつつデータをやりとりする。C# からは「どの Model のどのメソッドを呼び出すか」を決めて、Python 側からは「実際にメソッドを呼び出して結果を返す」ようにする。

C#Python」は Model の操作指定だけだから簡易的な独自プロトコルで十分
PythonC#」は少し複雑だから、何か適当なライブラリでシリアライズするのがよさそう

Model を デーモン越しに Python で組んだ副作用として、maya.cmds あたりが使えるようになった。ちょっと便利。もし速度が気になるなら、Model は C++ で組んでデーモンから .mll をロードするなり、そもそものデーモンから C++ で組めばいい。
Maya Python API 2.0 が整備されれば、速度面の問題はもしかしたら解決するかもしれない。そしたらもはや C++ を使う必要もないし、Python にするメリットだけが残る……ようになるといいなぁ。(遠い目)

もうひとつ副作用として、MVVM をだいぶ真面目に考える必要がでてきた。なんせ言語レベルで分離されてるもんだから、あまり適当なことはできない。まぁそれはそれで悪くない。

TCP 通信を使うことで C# 側を真面目に非同期で書かなきゃならなくなってるけど、まぁなんだ、TCP 云々に関わらず GUI ってそういうもんだ。GUI を組む大前提として、非同期に対する考慮は必要。