まきゼミ技事録!

とあるゼミのプログラマー達が送る技術ブログのようなもの

Mayaでコリジョン設定してUnityで使う話

こんにちは。ぴょんさんです。

暑いですね。水、飲みましょう。

 

今日はUnityとMayaの話です。

ウソです。ほとんどUnityの話でMayaの話はちょこっとなので、期待してこの記事を開いた方はごめんなさい(/ω\)

f:id:MakiZemi:20180726114924p:plain

Maya上でモデルにコリジョンを設定できるスクリプトと、自動でコリジョン情報からColliderコンポーネントを追加してPrefab化するUnityエディタ拡張を作成したので、それについてまとめます。

 

環境

  • Unity2017.4.0f1
  • Maya2018(2017でも動きます)

 

なぜ作ってしまったか

理由は2つあります。1つは、デザイナーが使い慣れているツールでコリジョンを設定できるからです。もう1つは、コリジョン情報とモデルデータを1つのファイルとして扱うことができるからです。

 

Unityでやったこと

↓図で表すとこんな感じです。ここでいうColliderオブジェクトはCollider設定用のオブジェクトのことです。

f:id:MakiZemi:20180726154727p:plain

まず、モデルをPrefabにしています。

そして出来たPrefabに、Collider Componentを追加します。追加するCollider Componentの種類は、あらかじめモデルデータに設定してあるColliderオブジェクトの名前から決定するようにしています。

f:id:MakiZemi:20180726150950p:plain
↑この図の例だとFUC_BoxがColliderオブジェクトにあたります。BoxなのでCone PrefabにBox Collider Componentを追加します。

その後、Colliderオブジェクトからpositionなどを取得し、追加したCollider ComponentのCenterなどのパラメータに値を設定します。

最後に、ColliderオブジェクトをPrefabに残す必要はないので削除します。

 

この一連の流れをエディタ拡張スクリプトで自動化しているので、そのソースも載せておきます。

Prefabを作成する処理は↓こちらを参考にしました。

Unity - Scripting API: PrefabUtility.CreatePrefab

本当はモデルを読み込んだときに処理を走らせるようにしたかったのですがうまくいかず、メニューから選択もしくはショートカットで処理を走らせるようにしています。

 

ここまで出来てしまえば、モデル作成時に手作業でColliderオブジェクトを作成すればよいのですが、ヒューマンエラー等の問題が起こることを防ぐために、Mayaのスクリプトも作成しました。

 

Mayaでコリジョンを設定するために作ったもの

github.com

ソースは↑こちらです。

ほぼ初めてのPythonだったのでよくわかんないコードになってますが、お許しください(>_<)

いつかmel.evalに頼らなくてもコードをかけるようになりたいです。

f:id:MakiZemi:20180726164733p:plain

実行するとこんな感じのウィンドウが表示されます。BoxもしくはSphereを選択すると、「FUC_XXX(XXXはBoxもしくはSphere)」という名前のオブジェクトが作られ、Colliderオブジェクトとなります。Colliderオブジェクトのみ表示方法を切り替える機能も実装しています。

 

まとめ

いかがでしたでしょうか。これでプログラマが手作業でColliderを設定する必要がなくなりました。また、デザイナーが、使い慣れたツールで思い通りのコリジョンを設定することも可能になり、効率よく開発できるようになったかと思います。
(ちなみにちょこちょこ出てきた「FUC」は「For Unity Collider」の略で、私が勝手につけた名前です。)

 

参考にしたところ

l-s-d.sakura.ne.jp

lo25131.hatenablog.com

qiita.com

 

Mayaのスクリプトは本や公式リファレンスを参考にしました。

 

おわりー(*‘∀‘)