UE4のImport Into Levelについて(C4D向け)

2016/9/2追記

UE4.13アップデートで「Import Into Level」機能の挙動が本記事とは変わったようです。「ヌルが他のメッシュに化ける」動作は(やはりというか)無くなったようで、常に「空のアクタ」として配置されるようです。「オブジェクトが倒れる」動作はまだ起きています。
UE4の新機能はリリースからフィックスされるまで多少の時間がかかるものと考えて、不可解な挙動があってもしばらく様子見しておくのがいいようですね。

記事は一応残しておきます。


また自分用メモみたいなやつです。UE4の新機能(開発途中?)「Import Into Level」について、検索しても詳しい情報をみつけられなかったので自分で試して調べました。UE4初心者なので記事の内容についてはあまり自信がありません。また、この記事はC4D R17とUE4.12を元に書かれていますので、後日この記事を読んでいる方はご注意ください。

前置き

3Dソフトで作ったアセットをUE4に持ってくにはFBXを使います。バラバラのパーツとして持って行ってUnreal Editor上でレイアウトする分には従来から標準で用意されているFBXインポート手順でいいのですが、たとえば建築CGなんかの場合は、アセットを作る3Dソフト(僕らの場合はC4D)のほうでレイアウトまでやってしまってからUEに持って行けたほうが作業は楽です。さらにその際、個々のオブジェクトの配置やピボット(C4Dで言うと軸)の位置は元通り維持されたままで、同一のオブジェクトは最初から同一のStatic Meshを参照するアクタとして配置されると都合がいいです。

そういった需要があるので、こういうスクリプトなんかも作られていました。

Cinema 4DからUnreal Engine 4への書き出し

そしてUE4.11からは、シーン丸ごとのFBXをいっぺんにインポートする機能がつきました。こちらの記事で紹介されています。

[UE4] FBXファイルを丸ごとインポート!――”Import Into Level”を使ってみる

この機能、僕がC4Dから書き出したFBXで試してみたところいくつか期待通りにならない部分がありました(というか最初はあまりにムチャクチャだったので使い物にならないかと思いました)。
僕が期待していた動作というのは、

1)オブジェクトのスケール、配置は元の通り
2)ポリゴンオブジェクトはStatic Meshアセットとして読み込まれ、「Static Meshアクタ」としてレベルに配置される
3)ヌルは「空のアクタ」として、元の階層を維持したままレベルに配置される
4)インスタンスはポリゴンオブジェクトが重複して読み込まれるのではなく、オリジナルと同じ単一のStatic Meshを参照する「Static Meshアクタ」としてレベルに配置される

というものです。(1)(2)(3)はできて当然としても(4)は無理じゃねえかと思ったのですが、実際にいろいろ試してみると条件付きではありますが可能でした。

いろいろ試行錯誤して状況を調べ、その範囲でわかったことを以下にメモしておきます。ただしFBXのトラブルは書き出し側に原因があるのか読み込み側に問題があるのかなんともいえず、上記(4)の対処法については「現状たまたまそうなっているだけ」という感触があるので、かなり場当たり的なバッドノウハウの類いであることをお断りしておきます。

Hierarchy Type

「Import Into Level」には「Hierarchy Type」というオプションがあり、インポートした複数のアセットをどういう状態でレベルに配置するか選べます。今回は「Create Level Actors」を選んで各アセットが独立したアクタとして配置される状態にしました。

スケールとオブジェクト名

UE4の基本単位は「cm」なので(どっかで変えられそうな気はします)、C4Dのプロジェクトスケールも「cm」にしないとスケールが合いません。たとえばC4D側が「mm」だとUE4に持って行ったとき10倍の大きさになります。

C4Dのオブジェクトマネージャは任意に並び順を決められますが、UEのアウトライナでは名前のアルファベット順などで自動ソートされてしまうため、並び順が変わります。
また、C4Dではオブジェクトの名前は同名で重複させることができますが、UEにインポートすると同名のオブジェクトは末尾に「_2」のように連番がついた名前で出現します。これはC4DからFBXファイルを書き出す段階で、同名オブジェクトには名前の末尾に連番が付加されているようです(FBXをテキストで読むとそうなっています)。あらかじめC4Dのほうで同名重複を避けて末尾に連番や記号をつけておく方がいいですね。

オブジェクトの並び順で結果が変わる

「Import Into Level」ではFBXファイル内でのオブジェクトの並び順や階層構造によってそれぞれがアクタとしてレベルに配置される状態が変わるようで、インポートしておかしな結果になるものにも一定の法則性があります。C4Dから書き出す場合、FBXファイル内の並び順はオブジェクトマネージャでの並び順の通りになるので、オブジェクトマネージャでの並び順をいじることで結果をコントロールできます。以下の記述ではそうした試行錯誤によって推測された条件を書いてあります。

シーンの一部または全部が倒れる

シーンの一部または全体が横や奥に90°倒れていることがあります。どうやら「C4Dのオブジェクトマネージャのルート直下の階層にカメラかライトがある」「それより後にヌルがある」の両方の条件が揃った場合にそうなるようです。倒れるのはカメラやライトよりも後のヌル(およびその下の階層すべて)で、ポリゴンオブジェクトは倒れないようです。
この現象は、カメラやライトが不要なら書き出さない、必要ならルート直下に置かずにヌルに入れる、という手順で回避できるようです(UE側でインポートの際にカメラなどをスキップしてもダメみたいです)。
要注意なのはC4Dの「エディタカメラ」です。「エディタカメラ」がレンダリングでアクティブな状態、またはカメラオブジェクトがない状態でFBXファイルをカメラをオンで書き出すと、「エディタカメラ」が「オブジェクトマネージャのいちばん上」に置かれた状態でFBXに書き込まれ、上記の条件にひっかかることになります。

ヌルがStatic Meshアクタに化ける

前述の要件(3)になります。「Import Into Level」ではC4Dのヌルが「空のアクタになる」場合と「いずれかのStatic Meshに化ける」場合があります。どちらになるかが決まる条件は「同階層で当該のヌル以前にポリゴンオブジェクトがあるかどうか」のようです。

・ある→ 直前のポリゴンオブジェクトに化ける
・ない→ 空のアクタになる

この「当該のヌル以前に」というのはUEのアウトライナでの並びではなく、「FBXファイルでの並び順」で、C4Dから書き出されたFBXではオブジェクトマネージャでの並び順の通りになっています。つまり、オブジェクトマネージャでの配置で「同階層で、より先」にポリゴンオブジェクトがなければヌルは化けずに「空のアクタ」のままということになるようです。

インスタンスでStatic Meshを配置できる?

前述の要件(4)になります。C4DのインスタンスはFBXに書き出すと「オリジナルの複製を内包したヌル」になります(C4Dで「編集可能にする」を実行した結果と同じです)。これを「Import Into Level」でUEにインポートすると、前述(3)のように「親:空のアクタ/子:Static Mesh(重複)」または「親:直前のStatic Mesh/子:Static Mesh(重複)」となります。C4Dではインスタンスで参照していてもUEでは別々のStatic Meshとして重複して読み込まれる、しかも場合により親が他のStatic Meshに化けるというどうしようもない感じになってしまうのですが、実は前述の(3)の条件と合わせると上手いこと「オリジナルと同じStatic Meshを参照するアクタ」にできます。

・インスタンスはオリジナルのポリゴンオブジェクトの同階層、すぐ後に並べる
・FBXを書き出す際にインスタンスをオフにする

C4D-FBX-UE4

これで、インスタンスは「同じStatic Meshを参照するアクタ」として配置されます。この例だと、UEのほうではStatic Meshアクタの「shoji_0」から「shoji_9」までの10個はすべて同じStatic Meshの「shoji_0」を参照しています。
なんでこうなるかといえば、C4DのインスタンスはFBXでは「親のヌル/子のポリゴンオブジェクト」になりますが、「親のヌル」は前述の条件(3)に従ってUEでは「直前のStatic Meshを参照するアクタ」に化け、「子のポリゴンオブジェクト」はインスタンスがオフになっていたためにFBXに書き出されていない、という結果です。
ただし、こんなあやふやな挙動が仕様上意図されたものだとは考えにくいので、将来的に機能が改良されてこの手は使えなくなる見込みがかなりあると思われます。
なお、C4D上では「オフにしたインスタンス」でも「ヌル」でもFBXに書き出せば同じ結果になるのですが、正しい配置を確認するのにはインスタンスを使う方が都合がいいです。インスタンス以外のジェネレータオブジェクト(対称とか配列とか)では前述の「ヌルが化ける」ことを利用できないので、この手は使えません。