2017年10月Unity TechnologiesはAutodeskとの協業を発表。Maya、および3ds MaxとUnityを使った作業のワークフローが大幅に機能強化、改善された。今回はこうしたUnityとAutodesk製品との連携について、ユニティ・テクノロジーズ・ジャパンのコミュニティエバンジェリスト小林信行氏に解説してもらった。
※本記事は月刊「CGWORLD + digital video」vol. 238(2018年6月号)からの転載となります
TEXT_小林信行(ユニティ・テクノロジーズ・ジャパン)
ユニティ・テクノロジーズ・ジャパン合同会社に所属するコミュニティエバンジェリスト。UnityやMayaをはじめとする各種3Dツールの研究、ゲーム制作ノウハウの普及、ユニティちゃんトゥーンシェーダー2.0の開発をしています。
Twiter @nyaa_toraneko
EDIT_海老原朱里 / Akari Ebihara(CGWORLD)、山田桃子 / Momoko Yamada
Maya&3ds Maxとの連携がさらに強化されたUnity 2018.1
2017年10月4日のニュースリリースにて、Unity TechnologiesはFBXファイルのインポート、およびエクスポート機能を強化し、Mayaおよび3ds MaxとUnityを使った作業のワークフローを改善することを公表いたしました。その成果が先日、正式リリースされたUnity 2018.1では多く利用できるようになりました。
多くのUnity開発者は、3DモデルをUnityにインポートして利用する場合、FBXファイル形式でDCCツールからデータをエクスポートすることでしょう。しかし今までは、FBXファイルで直接扱えるデータの部分が限られており、例えばMayaで作成したカメラのアトリビュートやアニメーションをUnityにエクスポートしたいような場合には、ひと手間かけることが必要でした。今回の協業の成果として、これらの「ひと手間」をアーティスト自らかける必要なく、エクスポートする対象としてDCCツール上で指定するだけで、FBXファイルにエクスポートされ、Unityにそのままインポートできる環境が整いました。またそれだけでなく、Unity上で作成したシーンをFBXファイル形式でMayaにエクスポートし、さらにMayaで作業した結果をそのままUnityにバックポートするという、FBXラウンドトリップというワークフローも可能になっています。
これらの成果の多くは、Unity側のエンジン開発エンジニアが、Autodeskが所有するFBXソースコードに直接アクセスできる権限を得たことで実現したものです。今はMayaが先行して開発が進んでいますが、今後3ds Maxでも可能な限り機能を実現していきますので、ご期待いただければと思います。
Unity 2018.1の新規トピック 1
FBX Importerの機能強化
今回はMayaを例に解説していきます。まずUnityにFBXファイルをインポートする側(FBX Importer)からみていきましょう。FBX Importerの機能は表立っては見えませんが、UnityのProjectビュー上でFBXファイルを選択したときに、Inspectorビューに現れている選択できるプロパティがそれにあたります。今回は最新の Unity 2018.1でみていくことにしましょう。
01 Modelタブ
■32 bit頂点バッファへの対応
〈Index Format〉を「32bit」にすることで32bit頂点バッファに対応します。従来までは約6万5千頂点を超えるモデルをインポートするとUnityによって自動分割されていましたが、32bit頂点バッファを指定することで、自動分割されずに1体のモデルとして扱うことができるようになります
■可視属性のインポート
〈Import Visibility〉をONにすることで、MayaなどのVisibilityアトリビュートをインポートします。Visibilityアトリビュートのキーアニメーションにも対応しています
■カメラのインポート
〈Import Cameras〉をONにすることで、カメラのアニメーションやアトリビュートをUnityにインポートすることができます
■ライトのインポート
〈Import Lights〉をONにすることで、シーン中のライトの種類やアニメーション、アトリビュートをUnityにインポートすることができます。ただし、Mayaなどのライトがもてる設定とUnityのライトがもてる設定は完全には一致しませんので、そのあたりの調整は手動で行う必要があります
02 Animationタブ
■コンストレイン
〈Import Constraints〉をONにすることで、Mayaのペアレント、ポイント、オリエント、スケール、エイムの各コンストレインをUnityにインポートできます
-
なお、Maya上で設定したコンストレインをFBXファイルにエクスポートするには、FBXエクスポート時にオプションよりコンストレインを出力するように指定する必要があります
-
Unityでは、コンストレインはゲームオブジェクトにアタッチされるコンポーネントとして扱われます。各コンストレインコンポーネントはメニューバーより、〈Component〉メニューの〈Miscellaneous〉より選択してアタッチすることもできます。Unityでは、MayaのポイントコンストレインがPosition Constraint、オリエントコンストレインがRotation Constraintになります。その他のペアレント、スケール、エイムの各コンストレインは名称も同じです
03 カスタムアトリビュート
さらにMayaのアトリビュートエディタから独自に設定したカスタムアトリビュートの値も、UnityのAnimator経由で取得することができるようになりました。カスタムアトリビュートを設定することで、例えばMaya上で歩行アニメーションの接地のタイミングで、カスタムアトリビュートに値を入れることで、Unity側でアニメーションデータから正確に接地タイミングを取得するなどの手法が簡単に実現できるようになります
例えば、画像のようにホバークラフトの高さに合わせてカスタムアトリビュート「ShipHight」を設定し、キーを打ちます
カスタムアトリビュートアニメーションを含むFBXデータをUnityにインポートします。FBXデータをProjectビューから選択し、InspectorのAnimat ionタブに切り替えます。〈Animation Custom Properties〉という項目にチェックをして、Applyボタンを押します
FBXファイルに含まれているアニメーションデータTake 001をProjectビュー上で選択し、Animationウィンドウを開きます。すると「Animator.Ship Hight」という名のアニメーションが読み込まれていることがわかります。これがMayaからインポートされたカスタムアトリビュートアニメーションです
カスタムアトリビュートをUnity上で利用する場合、Animatorコンポーネントを使います。アニメーションデータTake001を登録したアニメーターコンポーネントを作成し、Animatorウインドウで開きます。カスタムアトリビュートの値を取得するために、Parametersタブを開き、リストに新規パラメータを追加します。 今回はFloatのパラメータを追加します
新規作成したFloatパラメータの名前を、Maya上と同じカスタムアトリビュート名「ShipHight」(ナイスネームではないことに注意してください)として、プレイボタンを押すと、カスタムアトリビュートに設定されているアニメーション値が取得できているのがわかります
[[SplitPage]]
Unity 2018.1の新規トピック 2
FBX Exporterの提供
UnityのAssset Storeには、様々なアセットが出品されていますが、その中にはUnity Technologiesが出品しているアセットもあります。「FBX Exporter」というアセットもそれらのひとつです。
FBX Exporterを組み込む
FBX Exporter はAsset Storeから無料で手に入れることができます。Asset StoreビューからFBX Exporterを検索し、インポートボタンをクリックすると、インポートが始まります
-
〈Import Unity Package〉ウインドウが開いたら、右下の〈Import〉ボタンを押しましょう。現在開いているUnityプロジェクトにFBX Exporter が組み込まれます
-
FBX Exporer が正常に組み込まれると、Unityのメニューバーより〈GameObject〉メニュー内に〈Export Model...〉〈Convert To Linked Prefab Instance〉の2つの項目が追加されます。これらは、後ほど説明するFBXラウンドトリップで使用されるコマンドです
TIPS
MayaとUnityで作業ユニット単位を合わせる
さて、FBX ExporterやMayaからのコンストレインインポートを効率的に実行するために、事前にUnityとMayaとの間で作業するユニット単位を合わせておきましょう。Unityでは、1グリッドあたりの大きさは1mとなっています。一方、Mayaでは1グリッドあたりの大きさは、1m、1cm......、と初期設定で選ぶことができます。特にUnity上で物理演算をするときには、Mayaからインポートするオブジェクトも「1ユニット単位が1m」であることを保つ必要があります。以下のようにMayaおよびUnityを設定することで、上の関係を等しく保つことができます。
ユニット単位を合わせるための設定
Mayaでは〈Preferences → Settings → Working Units → Linear〉を〈meter〉で設定
-
MayaからFBXファイルをエクスポートする際に、〈Export Sellection → Advanced Options →Units〉より、〈Automatic〉をOFF。〈File units conversion to:〉を〈Centimeters〉で送ります
-
UnityでFBXファイルをインポートする際に、〈Inspector → Model〉タブより、〈Scale Factor〉を「1」 に、〈Use File Scale〉をONにして、〈Apply〉ボタンでインポート。なお、もちろんMayaでcm単位で作業している場合でも、作業者が「100ユニットで1m」と意識しているならば、問題はありません
FBXラウンドトリップ 1
FBX Exporterを活用したFBXラウンドトリップ
それでは、FBX Exporterを使いながら、実際に Unity 2018.1とMaya 2018との間でFBXラウンドトリップを使ってみましょう。
01 Unity側の準備
前述のようにFBX ExporterはAsset Storeからダウンロードします。UnityプロジェクトへのFBX Exporterのインストールが終了したら、メニューバーより〈Edit → Project Settings → Fbx Export〉を選択し、FBX Exporterの初期設定を行います
-
〈Inspector → Fbx Export Settings〉より〈Integration〉項目の〈3D Application〉リストボックスを見ると、システムにインストールされているDCCツールが表示されます。今回はMaya 2018を選択。続いて〈Install Unity Integration〉ボタンをクリックすると、オペレーションシステムのファイル選択ウインドウが開きますので、UnityとMayaを連動するプロジェクトフォルダを選びましょう
-
するとこのようなメッセージウインドウが出て、Maya 2018が起動します
インテグレーション用のヘルパースクリプトのセットアップが終わると、Maya 2018のFileメニュー内に〈Unity〉という項目が追加されます。〈Unity〉内には〈Export〉と〈Import〉の2つのコマンドがあります
02 Maya側の初期設定
続いてMaya 2018で〈Preferences →Settings〉より、作業ユニット単位を〈meter〉にしておきます。ほかにもSet Projectから、作業プロジェクトをUnityプロジェクトが使用するフォルダに合わせておくとよいでしょう。もしMaya 2018を閉じてしまって、Fileメニュー内から「Unity」がなくなってしまったときは、再びUnity上から〈Install Unity Integration〉ボタンをクリックし、同様の作業を再度実行する必要があります
インテグレーション用のヘルパースクリプトがプロジェクトにすでにインストールされている場合には、上書きするか、それとも既存のものを使用するか聞いてくるので、「Use Existing」を選びます
FBXラウンドトリップ 2
Unityシーン内のオブジェクトをMayaにエクスポート
Unityシーン内のオブジェクトは簡単にMayaにエクスポートできます。例としてUnityシーン内のTrackオブジェクトをMayaにエクスポートしてみましょう。
01 オブジェクトのエクスポート
Unityの〈Hierarchy〉ビューから、Trackオブジェクトを選択し、右クリックより〈Export Model〉を選択します。オペレーションシステムのファイル保存ウィンドウが現れますので、Track.fbxという名前で保存します
続いてMayaより、〈File → Unity → Import〉を選択し、直前に保存したTrack.fbxを読み込みます
02 カメラやルックの調整
Mayaのperseカメラの〈Near Clip Plane〉、および〈Far Clip Plane〉の設定値を、UnityにおけるMain Cameraのプロパティの設定値を参考に変更しましょう。元のモデルには当たり判定用のメッシュなども付いていますので、適宜非表示にして、シェーディング設定をハードウェアテクスチャリングにすると、ほぼUnity上と同じようなルックが得られます。また、Mayaのアウトライナーを見ると、新規にUnityFbxExportSetという名前の選択セットがつくられています。この選択セット内に名前のあるオブジェクトが、現在UnityのFBX Exporterプラグインによって管理されているオブジェクトです
[[SplitPage]]
FBXラウンドトリップ 3
Unityの特定のオブジェクト座標がMayaの原点に一致するようにエクスポート
オブジェクトのエクスポートについては上記の通りですが、この例のようにトラック全体のような大きなオブジェクトをUnityからMayaに転送する場合、Trackオブジェクトの中心がMayaの原点位置にそのまま送られてしまうと、使い勝手が悪い場合があります。特定のオブジェクト座標がMayaの原点に一致するようにエクスポートする方法をみていきましょう。
01 事前準備~「空のゲームオブジェクト」作成
画像のような場合なら、シーンビューの中心付近に表示されている、Shipsという名前のオブジェクトの中心がMayaの原点位置にきてくれるように、Mayaにエクスポートされるほうが扱いやすそうです。またShipsオブジェクトを構成している3つのホワイトボックスが、Mayaのグリッドに沿って配置されていれば、後のポリゴンエディットのときにも作業しやすいことでしょう。そのためには、いくつか事前準備をしておく必要があります
-
まずUnity の〈Hierarchy〉ビューより、Shipsオブジェクトを選択し右クリックします。さらに〈Create Empty〉を選択
-
すると「GameObject」という名前の「空のゲームオブジェクト」がShips階層内に作成されます。「空のゲームオブジェクト」とは、MayaでいうNullオブジェクトのようなもので、座標情報しかもたないオブジェクトです
02 事前準備~リネーム
-
空のゲームオブジェクトをリネームし、「Ships_pivot」とします
-
リネームしたShips_pivotを、Shipsの階層から表に出します。このとき、Ships_pivotとShipsの座標は一致しています
03 事前準備~複製
続いて、Ships_pivotを選択し右クリックし、「Duplicate」を選びます
-
Ships_pivot が複製されて「Ships_pivot(1)」ができますので、リネームして「Track_pivot」とします
-
これで元のShipsと同じ座標をもつ、空のゲームオブジェクトShips_pivotとTrack_pivotの2つができました
04 事前準備~ペアレント
Ships_pivot の子として、Shipsをペアレントします。Shipsの座標は位置回転ともに全てゼロになります
同様に、Track_pivot の子として、Trackをペアレントします。Trackの座標は、Track_pivot、すなわちShips_pivotを基準とした相対値となります
05 エクスポート
今度はTrack_pivotを基準にFBXファイルをエクスポートします。Unityの〈Hierarchy〉ビューよりTrack_pivotを選択し、右クリック。「Export Model」を選択し、「Track_pivot.fbx」として保存します
-
新規にMayaシーンを開きます。〈File → import〉を選択し、直前に保存したTrack_pivot.fbxを開きます
-
perseカメラのプロパティとシェーディングの設定を調整すると、今度はグリッドの上に良い感じにトラックが配置されているのがわかります。なお、〈Import〉コマンドを使ってFBXファイルをインポートすると、UnityFbxExportSetは作成されないことがわかります。MayaからUnityに戻す必要のないオブジェクトを送る場合には、こちらを使うと良いでしょう
FBXラウンドトリップ 4
プレファブのラウンドトリップ
続いて、 Mayaのグリッド上に沿うかたちで、3つのホワイトボックスをUnityからMayaにエクスポートします。作業イメージとしては、ゲームデザイナーがホワイトボックスに割り当てた仮の自機をMaya上で本番データに置き換えていくような作業です。まずはUnityシーン内のShips_pivot以下のオブジェクトをプレファブ化した後で、Mayaに転送。プレファブ化することで、ホワイトボックスにすでにアタッチされている様々なコンポーネント機能はそのまま、Maya上でメッシュをエディットするなどの作業ができるようになります。
01 インポート
-
〈Hierarchy〉ビューより、Ships_pivotを選択し右クリックし、〈Convert To Linked Prefab Instance〉を選択
-
すると、作業しているプロジェクト内に「Ships_pivot」という名前のファイルが2つできています。共に青いキューブのアイコンに、白いドキュメントアイコンが付いている方が実体であるFBXファイル、付いていない方がプレファブファイルです
-
Mayaに切り替え、〈File → Unity → Import〉を選択し、直前で作成したShips_pivot.fbxを読み込みます
-
Ships_pivot.fbx がMayaシーン内に配置されると、ホワイトボックスが作業しやすいようにMayaのグリッドに沿って配置されたことがわかります。アウトライナーよりUnityFbxExportSetを確認すると、Ships_pivot 以下のオブジェクトがFBX Exporterプラグインで管理されていることも確認できます
02 モデルの置き換え
-
では、Ship01以下のBox01を本番用のモデルに置き換えてみます。Ship01の直下にShip_Body_Ship_01などのメッシュを4つペアレントします。画像ではわかりやすいようにBox01を表示OFFにしています。このBox01オブジェクトに作用するコンポーネントは、親であるShip01側にアタッチされているので、新規に追加した本番用モデルにもそのまま作用します
-
さらに新規に追加したメッシュをアウトライナーで選択し、UnityFbxExportSetにドロップします。これで新規に追加したメッシュもFBX Exporterプラグインの管理下に入りました
-
Maya上での修正をUnity側に反映してみましょう。〈File →Unity →Export〉を選択します
-
Unityに切り替えるとすぐにプレファブが更新され、先頭の白いボックスが本番用のモデルに切り替わりました。同じ手順をくり返すことで、Mayaでのモデルの変更をUnityのプレファブ構造を壊すことなしに適用することができます。これらのワークフローを「FBXラウンドトリップ」と呼んでいます
03 カメラを追加してUnityに送る
-
Maya上で付けたメッシュ以外のオブジェクトをプレファブに反映することもできます。例として、新規にカメラを追加してUnityに送ってみましょう。Maya上で新規にカメラを作成し、MayaCameraと名付けます
-
MayaCameraをプレファブと一緒にUnityに送りますので、Ships_pivotの子としてペアレントします。FBX Exporterの管理下に置くために、UnityFbxExportSetにもMayaCameraを登録します
-
Maya上での修正をUnity側に反映します。〈File →Unity →Export〉を選択します
-
Unityに切り替えると、プレファブが更新されます。Ships_pivot内のMayaCameraを選択すると、Maya上と同じ画角設定のカメラがインポートされたことがわかります。今まではMayaのカメラ設定をUnityにそのまま送る際には、UnityとMayaのカメラ設定のちがいを理解した上でMELを書く必要があったのですが、FBXラウンドトリップを使えば簡単です
04 ライトを追加してUnityに送る
同様の方法で、Mayaで設定したライトをUnityに送ることもできます
FBXラウンドトリップ 5
3ds Max 2017でFBX Exporterを使う
FBX Exporterは3ds Max 2017にも対応しています。基本的にはMayaと同様の手順になります。
01 Unity側の準備
-
3ds Max 2017にFBX Exporterをインストールする手順はMayaと同じです。FBX Exporterの<Inspector→Fbx Export Settings>より3Dアプリケーションとして「3ds Max 2017」を選択し、<Install Unity Integration>ボタンを押します
-
インストール先のプロジェクトを指定すると図のような表示が出て、3ds Max 2017が起動します
FBX Exporterが 3ds Max 2017にインストールされると、メニューバーにUnityという項目が現れます。Unityメニューの中はMayaと同様に<Import>と<Export>の2つコマンドがあります。機能もMayaと同じです
02 3ds Max側の初期設定
-
3ds Maxの場合でも作業前に単位設定ウィンドウからディスプレイ単位スケールをメートルに修正しておきましょう
-
各FBXファイルを<Unity→Import>メニューから読み込むと3ds Max上でもMayaと同様に、作業しやすいように各オブジェクトが配置されていることがわかります