先日書いたこちらの記事ですが、

UE4のアセットをUnityにエクスポートする方法

UE4の大量のアセットを一つずつUnityにエクスポートするのは手間だという問題がありました。
色々試したところ、UE4のレベル(Unityで言えばシーン)を丸ごとUnityに持っていく方法を発見しました!

大量のアセットを一括でUnityに送りたい場合はかなり手間が減らせると思います!さらに、この方法では途中でBlenderを経由させるので、ついでにUE4のレベルをBlenderに持っていく方法もわかります。
さっそくその方法を紹介します。

1.UE4上での手順

とりあえずサンプルとして、UE4ユーザーにはおなじみの、StarterContent→Maps→Minimal_Defaultレベルを開いてみます。

メニューからファイル→「すべてエクスポート」を選択します。すべてじゃなくて一部のオブジェクトのみをエクスポートしたい場合は、必要なオブジェクトを選択した状態で「選択されたものをエクスポート」を選択します。

保存するフォルダの選択ダイアログが出るので、保存場所を指定してください。前回と違って、Unityのアセットフォルダ以外の適当な場所を指定してください。ファイルフォーマットは.objにしてください。

↑このようなダイアログが出るので、「はい」を選んでください。
前回の方法だと手作業でテクスチャをエクスポートしましたが、今回の方法では必要なテクスチャを自動で全てエクスポートしてくれます。ラクチンだ!

2.エクスプローラでの手順

エクスポートが完了したらエクスプローラで出力されたフォルダを見てみましょう。

こんな感じで、objファイル、mtlファイル、Gameフォルダができてます。
objファイルの中にレベルからエクスポートされたアセットが全部入ってます。
mtlファイルがありますが、前回の方法と違って、この中にアセットのマテリアル情報がちゃんとエクスポートされてます。
Gameフォルダは中を見てもらえばわかりますが、テクスチャが入ってます。色んなフォルダに散らばって入ってます。

ここで残念なお知らせですが、Gameフォルダ以下の色んなフォルダに散らばってるテクスチャ画像をobjファイルと同じ階層に移動させる必要があります。すごい面倒くさそうですね。

そこで、エクスプローラの右上にある検索機能を使います。エクスポートされたテクスチャは全てbmp形式なので、”bmp”という単語で検索すれば、色んな場所に散らばったテクスチャが全て表示されます。これらをすべて選択して、「切り取り」してobjファイルがあるフォルダに「貼り付け」すればOKです。

3.Blenderでの手順

次はobjファイルをBlenderにインポートします。「なんでobjをそのままUnityにインポートしないの?」というと、Unityは何故か分かりませんがUE4からエクスポートしたobjのmtlファイルを読み込んでくれないので一旦Blenderを経由します。

Blenderに最初からデフォルトでいるCamera、Cube、Lightはいらんので削除します。

ファイル→インポート→Wavefront(.obj)を選択します。

ファイル選択ダイアログが出るので、さっきのobjファイルを選択します。この時、ダイアログの右側にインポート設定画面があるので、「Split by Object」と「Split by Group」にチェックを入れてください。「OBJをインポート」ボタンを押すとインポートされます。

おお、UE4のレベルがBlenderで読み込めました!
テクスチャが表示されない!という人は、3Dビューのシェーディングモードがマテリアルプレビューモードになってることを確認してください。(上の画像の一番右上のやつ)

おおむねちゃんと読み込まれてますが、この時点で失われてるマテリアルもありそうです。例えば椅子の下の床は真っ白になっちゃってます。
UE4からのエクスポート時に割とテクスチャのベイクとかはしてくれるみたいですが、複雑なマテリアルだとうまく行かなかったりするのかもしれません。確実に成功させる方法はまだ分かりませんが、「アクタのマージ」とかしておいた方が成功しやすかったりするかも?

うまく行ってない箇所はあとで手作業で調整してください。

次に、Blenderからglbファイルをエクスポートします。ファイル→エクスポート→glTF 2.0(.glb/.gltf)を選択します。

ファイル保存ダイアログが表示されるので、適当な場所を選んでください。ダイアログ右側の保存オプションで、フォーマットはglTFバイナリを選択。すべてエクスポートしたいので「選択したオブジェクト」のチェックは外してください。エクスポートボタンを押すと保存されます。

glbファイルが出力されますが、この一つのファイルの中にテクスチャとかも全部入ってます。

4.Unityでの手順

ようやくUnityにたどり着きました。Unityエディタを開きましょう。

UnityでglTFファイルを開くには、UniVRMの中に入ってるUniGLTFが必要です。

https://github.com/vrm-c/UniVRM/releases

↑こちらのページから最新版のUniVRMパッケージをダウンロードしてUnityにインポートしてください。

完了したら、blenderから出力したglbファイルをUnityに放り込みます。

インポートされてできたプレハブをシーンに放り込んでみます。

やったぜ。

なんも手作業しなくてもマテリアルが維持できている事に感動しますね。
BlenderからFBXを出力してUnityに持っていくとテクスチャ参照がはがれちゃったりしますが、gltf形式だとそのまま持っていけます。(テクスチャ参照してるだけのシンプルなPBRマテリアルの場合です。複雑なノードのマテリアルだと無理でしょう)

とは言え、Blenderの時からさらに失われてしまってる部分もありますね。テーブルの上の置物が真っ黒になってしまってます。他はおおむね大丈夫そうですが、ダメになっているところは手作業で調整が必要ですね。

結果から言うと、必ずしも100%完璧ではないですが、UE4のレベルを丸ごと一発でUnityまで持ってくることに見事成功しました。

一つずつ手作業でエクスポートしなくて済むので絶対便利ですね。

いくつか注意点がありますが、まず何故かUE4からのエクスポート時にテクスチャが全てbmp形式にされちゃうので、元のテクスチャのアルファ値が失われてそうな気がします。
また、UE4上ではインスタンスとして配置されていたオブジェクトが、エクスポートするとイチイチ別のオブジェクトとして書き出される点に注意してください。今回の例では二つの椅子が別のオブジェクトにされちゃってそれぞれ別々にメッシュが出力されちゃってます。という事は同じ木を100本生やすとメッシュのデータが100倍に増えます。

その辺に気を付けつつ、是非みなさんも今回のテクニックを使ってUE4のオブジェクトをじゃんじゃんUnityに持って行って使い倒しましょう!