チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第72回:UnityとMayaの連携を改造してみよう!
- Maya
- ゲーム
- コラム
- スクリプト・API
- チュートリアル
- データ
- 中級者
「Send To Unity」という機能で、MayaからUnityのプロジェクトにFBXを書き出せるようになってからしばらく経ちます。
使ってみると凄く楽!なのですが、書き出し先のUnityのプロジェクトを指定してから書き出すため、プロジェクトの場所を探すのに意外と一苦労します…。
Unityのプロジェクト情報を引っ張れたらいいのに、と思ったのは私だけではないでしょう!
10月には「UnityとMayaでデータの連携を強化します」というアナウンスもありましたし、ここは一つUnityとMayaを連携させてみましょう。
MayaでPythonが動きますので、他のソフトとの連携は色々な形で出来るものです。
PythonでUnityのプロジェクト履歴が取れれば、後はMayaで設定するだけですので思ったより簡単なはず!
というわけでUnityのデータを引っ張ってきて、「Send To Unity」をもっと使いやすくしてみましょう。
PythonでUnityのプロジェクト履歴を取る
ウェブで色々と調べてみると、どうやらUnityのプロジェクト履歴はレジストリに記録されているようです。(Windows)
レジストリエディタを開き、次のキーまで辿ります。
HKEY_CURRENT_USER\Software\Unity Technologies\Unity Editor 5.x
「RecentlyUsedProjectPaths-#」という名前で書かれているところを開いてみると、データにフォルダへのパスが書かれていることを確認できます。
さて、プロジェクト履歴の場所は分かりましたが、どのようにPythonで取得するか…。
幸いなことにウインドウズのレジストリにアクセスするモジュール、_winregが用意されていますので簡単に取れます。
次のように書くだけでUnity Editor 5.xの情報を取れます。
import _winreg key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'Software\Unity Technologies\Unity Editor 5.x') regInfo = _winreg.QueryInfoKey(key) print regInfo # (0, 123, 131553754000723024L)
_winreg.QueryInfoKeyの返り値は配列です。二つ目の要素には、Unity Editor 5.xが含んでいるデータの数が返ってきます。
続けて次のように実行すれば全ての「RecentlyUsedProjectPaths-」のパスを得られます。
for i in range(regInfo[1]): v = _winreg.EnumValue(key, i) # v には名前とデータが配列で来ます。 if 'RecentlyUsedProjectPaths-' in v[0]: print ('path %s' % v[1]) # path D:/Documents/Unity/projects/ToonSample # path D:/Documents/Unity/projects/New Unity Project
Send To Unityのプロジェクト設定
次はMayaでUnityのプロジェクトを設定する方法の確認です。
「Send To Unity」を使うために、Plug-in ManagerでGamePipeline.mllをロードしておきましょう。
「File > Send to Unity > Set Unity Project」が何を実行しているか確認してみましょう。
Shift + Ctrlを押しながらメニューから「Set Unity Project」を選び、メニューをシェルフに登録します。
登録したシェルフボタンを右クリックしてメニューを出してEditを選んで中身を見ると「SendToUnitySetProject」を実行していることがわかります。
これが何か調べるにはwhatIsコマンドを使います。
次のようにスクリプトエディタで実行します。
// MELとして実行 whatIs SendToUnitySetProject; // Result: Run Time Command //
Run Time Commandと言われました。
ランタイムコマンドは、Mayaのヘルプにコマンドとして出て来るものではなく、今のユーザのMayaの環境にだけあるコマンドです。
実際にはスクリプトが含まれていますが、使いやすくするために一言のコマンドで実行できるようになっています。
Run Time Commandの実際の中身の調べ方は二つあります。
一つはHotkey Editorから調べる方法です。
もう一つはrunTimeCommandコマンドで調べる方法です。今回はこちらで行きましょう。
次のようにスクリプトエディタで実行すると、具体的な中身が出力されます。
// MELとして実行 runTimeCommand -q -c "SendToUnitySetProject"; // Result: GamePipeline -sp "Unity" //
「GamePipeline -sp “Unity”」と出力されました。
ハイフンを使ったフラグが出てきたら、これは本気のコマンドです。本気のコマンドはMayaのヘルプに記載されているのですが、GamePipelineはプラグインなので、Mayaのヘルプに説明が出てきません…。
そこで色々と裏の手を駆使して実行している内容を調べると(♡企業秘密♡)、
次のスクリプト内のGamePipelineSetUnityProjectを実行していることがわかります。
C:/Program Files/Autodesk/Maya2018/scripts/others/GamePipelineCreateUI.mel
更に確認すると、結局はoptionVarのUnityProjectという値をUnityのプロジェクトとして使用していることがわかります。
(optionVarコマンドはMayaの設定情報を読み書きします。
C:\Users\ユーザ名\Documents\maya\2018\prefs\userPrefs.melに保存されます。
設定を変えると大抵のものはここに保存されます。)
そういうわけですので、単純にoptionVarを設定すればUnityのプロジェクトを指定できます。
// MELとして実行 optionVar -stringValue "UnityProject" "D:/Documents/Unity/projects/New Unity Project"; // 現在のUnityプロジェクトを照会。 optionVar -q "UnityProject"
optionVarのUnityProjectに有効なパスが設定されていれば「Send To Unity > All, Selection」を選んだときに、Unityのプロジェクトが開くようになります。
ツールを仕上げよう!
Unityのプロジェクト設定、取れた。
MayaでUnityのプロジェクト設定、出来た。
というわけでこれらをくっつけて一つのツールにします。
次のようなUI(ちょっとだけUnityのプロジェクト設定に似た何か)が立ち上がり、クリックするとそのプロジェクトにセットする、という仕組みにします。
「Send All」「Send Selection」ボタンを押すことで「File > Send To Unity > All, Selection」を実行するのと同じ事が出来るようになるとなお便利そうです。
と、色々と説明したいのですが、コードが多少長いため後はコードをダウンロードしてご確認ください…。
中身をまるごとスクリプトエディタで、Pythonとして実行すると上記のようなUIが出ます。
Unity5.xを使ったことがないとエラーになるかもしれません。
Unityのプロジェクト設定をMayaに持ってくる、これだけのことですが作業の「気持ち」がかなり軽くなります。
まとめ
Unityはとてもフレンドリーなゲームエンジンで、Pythonを使えば色々な情報をMayaと連携できる可能性があります。
直接データを共有できなくても、Unityのエディタスクリプトでデータを何処かに出しておいて、Mayaが読み込むということも出来るでしょうし、逆にMayaが何かデータを書き出しておいて、Unityからアクセスさせるということも出来ます。
連携を強めると作業がグンと楽になりますので、ちょっとしたことでもぜひツール化してみてください。
他にもUnity+Mayaで連携するネタがあればコラムに載せていきますので、乞うご期待!