【Unreal Engine】ブループリントを使用してFBXのインポートを自動化する方法

この記事はhttp://https://qiita.com/advent-calendar/2022/ue の7日目の記事です。

クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチーム
駆け出し新人TAの黒坂です。

今回は、FBXファイルのインポートをボタン1つで行えるツールについて
話したいと思います。

作成をしようと思ったキッカケ

これまで、FBXファイルの自動インポート処理については、
Pythonのコードにて実行できるソースコードを使用していました。

しかし、Pythonコードを実行する処理を書いていくと、
ブループリント側からでは何を行っているのかわからず、
コンテンツブラウザ側からもPythonのソースコードを
確認ができないため、ブループリントで全部作って
わかりやすくしたいと思ったのがキッカケです。

今回の目的

  • ブループリントのみでFBXの自動インポートを実現する
  • 複数のFBXファイルをボタン1つでまとめてインポートする

使用するバージョン

  • バージョンはUE5.0.3を使用して作成しています。

EUWの生成とUI設定

初めに、エディタ上で使用できるツールを作成できる
EUW(EditorUtilityWidget)アセットを生成し、
インポートを実行するためのUIを設定します。
EUWの詳細については公式ドキュメントをご確認ください。
http://https://docs.unrealengine.com/5.0/ja/editor-utility-widgets-in-unreal-engine/

今回は、インポート用の実行ボタンがあれば問題ないので、
画像のようにボタンを配置し、ボタンのOnClickイベントから
処理を実行するようにします。

BPの概要

本題のBPの作成に移ります。

FBXをインポートするためには、インポートオプションの設定を行う
「FbxImport UIクラス」とインポートするファイルなどの設定を行う
「Asset Import Task」クラスの設定を行ったうえで、
「Asset Toolsクラス」の[ Import Asset Tasks]を実行する必要があります。

FbxImport UIの設定

初めに、Fbx Import UIの設定を行っていきます。
Fbx Import UIの設定を行うには、Fbx Import UIをターゲットに各種値を
セットしていく必要があるため、初めにFbx Import UIオブジェクトを作ります。

※ここで設定をしていないインポートオプションは前回のインポート
(エディタでの通常の方法)を実行した際の設定を
使用するみたいなので、必要な項目は設定しておきます。

「クラスからオブジェクトを構築」ノード

クラスを指定してオブジェクトを作成することができるノードです。
英語だと「Construct Object from Class」
アクタではないオブジェクトを作成することができ、
作成したオブジェクトの参照を取得することができます。



作成したFbx Import UIの参照は後ほど使用するため、一度変数に保存します。
「Fbx Import UI」のオブジェクトリファレンス型変数を作り、そこにSetします。



続いて、各種インポートの設定を行っていきます。
インポートの設定で指定できる項目は、
ノードの検索欄に「Fbx Import UI」と入力すると表示されます。
表示されない場合は「状況に合わせた表示」のチェックを外して検索を行うと
表示がされるかと思います。

また、詳細な内容は、Pythonの公式ドキュメントからも確認できます。
http://https://docs.unrealengine.com/5.0/en-US/PythonAPI/class/FbxImportUI.html?highlight=fbx%20import%20ui#unreal.FbxImportUI

今回はMaterialのインポートをせずに、メッシュのみインポートする設定を
行ってみます。
FBX import UIの中にある「Set Imporyt Mesh」ノードを選択し、繋げます。
さらに、「Set Import Materials」ノードも作成します。

Asset Import Taskの設定

続いてインポートするファイルパスや保存先のパスなどを指定すAsset Import Taskの設定を行っていきます。

初めにFBX import UIと同様に、クラスからオブジェクトを生成します。
Asset Import Taskの参照も後ほど使用するため、
AssetImportTaskオブジェクト参照型の変数にいれておきます。



次にインポートする保存アセットの名称、保存先のフォルダパス、
ファイルパスを設定します。
保存アセットの名称を設定する「Set Destination Name」、
保存先のフォルダパスを指定する「Set Destination Path」、
インポートするファイルのパスを指定する「Set filename」を作成し、繋げます。



「Set filename」には、fbxファイルの保存元の絶対パス
「Destination Name」には、絶対パスからパスと拡張子を除いたファイルの名称
「Destination Path」には、UE内の相対パスでアッセットの保存先ディレクトリを
指定します。



次に、先ほど作成したFBX import UIを「Options」に設定します。

Import asset tasksノードを呼び出す

ここまでで基本的な設定はできたので、Asset Import Tasksノードを呼び出して、
インポートを実行できるようにします。

実際のインポート処理を行う「Import Asset Tasks」ノードを作成します。



ターゲットを確認してみると「Asset Tools インターフェース」となっています。

「Asset Tools インターフェース」は、
「Get Asset Tools」ノードにて取得できます。



さらに、Import Tasksをよく見ると、入力が配列型になっているのがわかります。
これは先ほど作成した、「Asset Import Taskオブジェクト参照の配列型」
になります。
そのため、Import Asset TasksノードのImport Tasksピンから
「配列を作成」ノードを作り、そこに、先ほど作成した
Asset Import Taskオブジェクト参照を割り当てます。

処理をつなげて実行してみる

ここまでの処理をボタンのOnClickedイベントとつなげて実行できるようにします。
このあとFBX import UIとAsset Import Taskへ追加の設定を行うことを
想定してここまでに行った3つの処理をそれぞれSequenceノードに
つなげて処理の追加が行いやすいように整理しておきます。



EWUを起動し、作成したボタンをクリックして処理を実行してみると、
インポートダイアログが表示されてしまいます。



これでは自動でのインポートになりません。
自動でインポートをするには、Asset Import Taskの「Automated」変数を
Trueに設定する必要があります
先ほどまでと同様の手順でAsset Import Taskの「Set Automated」ノードを
呼び出し、Trueの設定で接続します。



もう一度実行をしてみると、インポートオプションのダイアログは
表示されずインポートされました。

複数のファイルを一括でインポートする

複数のFBXファイルをまとめてインポートしようと思います。
何かしらのリストにインポートする対象のファイルが記載されていることを
想定すると、一括でインポートするには、Asset Import Taskの
「Filename」と「Destination Name」のファイルパスに関係する部分のみ
変更すればよさそうです。

テスト用に、ファイルパスを格納した配列を用意します。
この配列のファイルをすべてインポートするには、
配列の数だけインポート処理がループすればよいので、
Asset Tools の処理の前に「For Each Loopノード」を追加します。

このままだとインポート対象のファイルが変更されないため、Asset Import Taskの「Filename」と「Destination Name」の値を変更するように設定します。



これでインポートを実行してみると、配列に登録してあった
「pCube」「pCube2」の2つのファイルがインポートされます。

※Import Asset Automated という別のノードでは、
配列で指定したファイルをすべてインポートするという機能がありますが、
そちらのノードでの一括インポートの際に、インポートオプションを
BP上から設定することがうまくできなかったため、
Asset Import Tasksの処理をループさせる設定を採用しました。

わかりづらいFbx Import UIの設定

Fbx Import UIでは、通常のインポート時に表示される
オプションの項目を設定できるのですが、Fbx Import UIクラスとは
異なるクラスに設定されているプロパティがいくつかあります。
それらについては、「Get StaticMesh Import Data」や
「Get Texture Import Data」にて取得できるオブジェクト参照から
値を設定することができます。



下記の画像のようにGetノードから取得した参照をターゲットに
プロパティの値を設定することができます。


また、インポートオプションのその他にある項目の
「Convert Secne Unit」などはStaticMesh Import Dataにはありませんが、
その継承元であるFbx Asset Import Dataに存在しているため、
StaticMesh Import Dataをターゲットに設定をすることが可能です。

全体図

最後に

今回はFBXを自動でインポートする機能について解説をさせていただきました。
Pythonを使用されている方はブループリントのドキュメントだけでは
わからないこともPythonのAPIドキュメントを合わせて確認することで
理解がしやするなるかと思います。

私もまだまだ知らない機能や仕組みが多く未熟ですが、
この記事がアンリアルエンジンを使用する方の助けになれば幸いです。

明日のカレンダー2は@toyota_ryuroさんの
「【2D】マウスカーソルの方向 and スティック入力方向にオブジェクトを向かせる処理」です。
皆さんの記事をみて私も勉強しようと思います!!


COYOTE 3DCG STUDIO
公式HP:COYOTE 3DCG STUDIO

COYOTE 3DCG STUDIOはクリーク・アンド・リバー社が運営するゲーム専門3DCG制作集団です。
キャラモデル、背景モデル、3Dアニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。


Author: kurosakashun