【Unity】MayaとUnityで通信する

色々方法はあると思いますが、今回はUDPを用いて通信してみます。
今回はMayaで開いているシーンファイルの場所をMayaから送信し、これをUnity上で表示するものを考えてみます。

Unity側の準備

Unityは受信側なので、UdpClientのReceiveを用いて受信を行います。
実装方法は色々ありますが、今回はUniRxを利用した以下を使わせていただいてみます。
qiita.com

UdpReceiverRx.csを配置し、使用法にあるようなクラスを作成して適当なオブジェクトにAddComponentすればUDPの受信に関しては準備完了になります。
また、MayaとUnityのディレクトリの同期に関しては、先日書いたシンボリックリンクを作成する方式で行います。
tm8r.hateblo.jp

というわけでコードはこんな感じ。
gist.github.com

46行目で読んでるメソッドはざっくり言うと以下のように、loadedというクラスフィールドのGameObjectでロード済みのオブジェクトを管理しつつ、fieldという名前のGameObjectの子供として指定されたモデルをロードする、というようなことをしてるだけです。

GameObject field; // ロードするオブジェクトの親となる空のGameObject
GameObject loaded; // ロードするオブジェクトを管理する
(略)
if (loaded != null) {
    DestroyImmediate (loaded);
}
loaded = Instantiate (Resources.Load<GameObject> (path));
loaded.transform.SetParent (field.transform, false);

また、メッセージはjsonで送る想定なので、actionとpathというstringを持つUdpMessageクラスを作成し、これをJsonUtilityを用いてデシリアライズします。

Maya側の準備

次にMaya側ですが、こちらは以下のようなシンプルなコード。

import socket
import maya.cmds as cmds
import json

host = "127.0.0.1"
port = 10000

filepath = cmds.file( q=True, sn=True)
message = {
    "action" : "Load",
    "path" : filepath
}

messageJson = json.dumps(msgDict)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(messageJson, (host, port))

cmds.fileメソッドに参照のフラグであるqとシーンファイルパスを取得するフラグであるsnを指定し、これをUnity側に送信します。

あとはこれをシェルフに登録すれば、UnityのAssets/Resources配下にシンボリックリンクが作成されているディレクトリに保存されたシーンファイルを操作している限り、シェルフをぽちるだけでUnity側で該当のオブジェクトを表示することができます。
シーンだけじゃなくてFBXなども対応させるのであれば、snじゃなくてlocを使う形にすればいける気はします。
file command

おわり

実際はUnity側で任意のMaterialをあてるみたいなスクリプトも必要になると思いますが、これであんまりUnityのことが分からないアーティストさんでも簡単にUnity上で作成中のモデルをプレビューができたりするんじゃないかなーという目論見でした。

スポンサーリンク