色々方法はあると思いますが、今回は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上で作成中のモデルをプレビューができたりするんじゃないかなーという目論見でした。