Interchange フレームワーク は Unreal Engine のインポート/エクスポート フレームワークです。ファイル形式に依存しない、カスタマイズ可能な非同期のフレームワークで、ランタイム時に使用できます。
Interchange のインポート インターフェース
Interchange では、カスタマイズ可能なパイプライン スタックを提供する拡張可能なコード ベースを使用します。これにより、ブループリントまたは Python を使用して、プロジェクトのニーズに合わせてインポート パイプラインを自由に調整することが可能になります。
重要な概念と用語
- パイプライン:インポートされたデータを処理する操作のコレクションです。パイプラインでは、インポート プロセスのカスタマイズに使用するオプションが公開されます。
- パイプライン スタック:インポートされたファイルを処理するパイプラインの順序付きリストです。スタック内で複数のパイプラインが組み合わされて、特定のファイル形式に割り当てられます。パイプライン スタックは [Project Settings (プロジェクト設定)] > [Interchange] にあります。
- ファクトリ:インポートされたデータからアセットを生成する操作です。
Interchange プラグインを有効にする
Interchange フレームワークには Interchange Editor プラグインと Interchange Framework プラグインが必要です。これらはデフォルトで有効ですが、プロジェクトで有効になっていない場合は、プロジェクトの [Project Settings (プロジェクト設定)] で有効にしてください。プラグインを有効にする方法については、「プラグインを操作する」を参照してください。
アセットをインポートする
アセットを Unreal Engine にインポートするにはいくつかの方法があります。アセットは、コンテンツ ドロワーまたはコンテンツ ブラウザのメイン メニューから [File (ファイル)] > [Import Into Level (レベルにインポート)] を選択することでインポートできます。ファイルのインポートの詳細については、「アセットを直接インポートする」を参照してください。
現時点で [Import Into Level (レベルにインポート)] オプションは glTF および MaterialX ファイル形式に対応しています。
インポート プロセス
これらの方法でインポート プロセスがトリガーされます。
- 先述の方法のいずれかを使ってインポート プロセスを開始します。
- これによって [Interchange Pipeline Configuration (Interchange パイプライン設定)] ウィンドウが開きます。
- 使用するパイプライン スタックを [Choose Pipeline Stack (パイプライン スタックを選択)] ドロップダウン メニューから選択します。
- 必要な項目を設定し、[Import (インポート)] をクリックしてインポート プロセスを完了します。
このインターフェースを使ってインポート設定を選択し、[Import (インポート)] をクリックして続行します。
それぞれの方法では、エンジンによって対象のファイル形式が Interchange フレームワークでサポートされているかどうかがチェックされます。サポートされる場合、Interchange ではその形式に適切なインポート パイプライン スタックを使用して、以下のプロセスに進みます。
- Interchange により、インポートされたデータが Unreal Engine の中間ノード構造体に変換されます。
- Interchange はパイプライン スタック全体を確認して、インポートに関する指示に従います。
- ファクトリを使ってその結果からアセットを生成します。
ファイル形式が Interchange でサポートされていない場合は、Unreal Engine のレガシー フレームワークによってファイルがインポートされます。
Interchange を使ってアセットを再インポートする
Interchange を使って以前にインポートしたことのあるアセットを再度インポートする場合は、そのときのパイプラインやオプションが Unreal Engine に記憶されているため、それらのオプションが表示されます。
ブループリントを使用してアセットをインポートする
ブループリントを使用して、Interchange フレームワークを介してアセットを Unreal Engine にインポートすることができます。
このブループリントの例では、Interchange を使ってランタイム時にファイルをインポートするオブジェクトを作成します。
たとえば、この機能を使用して、ファイルを Interchange を介してランタイム時に Unreal Engine ベースのアプリケーションにインポートすることができます。上記の例では、デフォルトのテクスチャ パイプライン スタックを使って特定の場所にテクスチャ ファイルをインポートする関数を作成しています。現時点で、このインポート方法ではスケルタルメッシュまたはアニメーション データはサポートされていません。
新しいブループリント クラスを作成する
上記の例を再度作成するには、次のステップを実行します。
- この関数を含める新しいアクタ ブループリント クラスをプロジェクトに作成します。コンテンツ ブラウザ 内を右クリックして、コンテキスト メニューから [Blueprint Class (ブループリント クラス)] を選択します。
-
[Pick Parent Class (親クラスを選択)] ウィンドウで [Actor (アクタ)] を選択し、新しいブループリント クラスに「InterchangeActor」という名前を付けます。
新しいブループリントの親クラスを選択します。
関数を追加する
- 新しいブループリントをダブルクリックしてエディタを開きます。
-
[My Blueprint (マイ ブループリント)] パネルの [Functions (関数)] セクションにある プラス記号 (+) のボタンをクリックして、新しい関数に「InterchangeImport」と名前を付けます。
新しい関数を作成します。
ノードを追加してつなげる
- Sequence ノードを追加して、それを関数の出力につなげます。
- Then 0 出力からドラッグして、インポート対象の既存のファイルを参照するための Create Source Data ノードを作成します。
- Create Source Data の In File Name 入力からドラッグし、コンテキスト メニューから [Promote to Variable (変数化する)] を選択します。
- その新しい String 変数に「FilePath」と名前を付けます。この変数では、インポート対象のファイルの位置を保持します。
- ブループリント内でこの新しい変数を選択し、[Instance Editable (インスタンス編集可能)] チェックボックスをオンにします。これにより、ブループリントのインスタンスごとにこの変数が編集可能になります。
- Create Source Data ノードの出力を「SourceData」という名前の新しい変数に昇格します。
- シーケンスの Then 1 出力からドラッグして Get Interchange Manager Scripted ノードを作成します。これにより、次のステップで使用する Interchange Manager へのポインタが作成されます。
- Get Interchange Manager Scripted 出力からドラッグして Import Asset ノードを作成します。Get Interchange Manager Scripted からの戻り値を Import Asset の Target 入力 につなげます。
- Content Path 入力からドラッグして、これを「SavePath」という名前の新しい変数に昇格します。この変数では、新たにインポートされたファイルの位置を保持します。
- ブループリント内でこの新しい変数を選択し、[Instance Editable (インスタンス編集可能)] チェックボックスをオンにします。
- Source Data 変数への参照を取得して、それを Import Asset の Source Data 入力につなげます。
-
Import Asset Parameters 入力からドラッグして Make Input Asset Parameters ノードを作成します。
クリックしてフルサイズで表示。
関数をランタイム時に使用できるようにする
- [My Blueprints (マイ ブループリント)] パネルで InterchangeImport 関数を選択し、[Details (詳細)] パネルの [Call In Editor (エディタで呼び出す)] の隣にあるチェックボックスをオンにします。このオプションをランタイムで有効 (オン) にすると、この関数を InterchangeActor オブジェクトの [Details (詳細)] パネルで使用できるようになります。
- ブループリントを 保存 して コンパイル します。
新しいブループリントを使用する
- InterchangeActor ブループリントのコピーをレベル内にドラッグします。
- [Play (プレイ)] をクリックします。
- アウトライナー で InterchangeActor を選択します。
- [Details (詳細)] パネルで、FilePath と SavePath をそれぞれ設定します。
- [Interchange Import (Interchange インポート)] ボタンをクリックしてファイルをインポートします。
上記のブループリントの例に Import Scene ノードを加えることで、アセットがシーン内に直接スポーンされます。
Interchange をクック済みのアプリケーションで使用する
Interchange フレームワークをクック済みのアプリケーションでランタイム時に使用する場合は、[Project Settings (プロジェクト設定)] の [Project (プロジェクト)] > [Packaging (パッケージ化)] セクションにある [Additional Asset Directories to Cook (クックする追加アセット ディレクトリ)] に「Interchange」フォルダを追加します。
クリックしてフルサイズで表示。
Python を使用してアセットをインポートする
Python スクリプトを使用して、Interchange フレームワークを介してアセットを Unreal Engine にインポートすることができます。
import unreal
gltf_path = "D:/projectPS/gltf/sketchfab/ship_in_a_bottle/scene.gltf"
source_data = unreal.InterchangeManager.create_source_data(gltf_path)
import_asset_parameters = unreal.ImportAssetParameters()
import_asset_parameters.is_automated = True
eas = unreal.get_editor_subsystem(unreal.EditorAssetSubsystem)
import_asset_parameters.override_pipelines.append(eas.load_asset("/Interchange/Pipelines/DefaultSceneAssetsPipeline"))
import_asset_parameters.override_pipelines.append(eas.load_asset("/Interchange/Pipelines/DefaultSceneLevelPipeline"))
ic_mng = unreal.InterchangeManager.get_interchange_manager_scripted()
ic_mng.import_scene("/game/testinterchange/autopython/",source_data,import_asset_parameters)
上記の例では、Python スクリプトを使って、先述のブループリント例に似たプロセスで「scene.gltf」ファイルをインポートします。
パイプライン スタックを編集する
Interchange フレームワークを利用するメリットの 1 つとして、アセット データを処理する各プロセスのカスタマイズ可能なスタックである「パイプライン スタック」を選択してカスタマイズする機能があります。インポート プロセス中にパイプラインをデフォルトのパイプライン スタックに加えて、動作を追加することができます。
Unreal Engine には以下のデフォルト パイプラインが備わっています。
- Default Assets Pipeline
- Default Material Pipeline
- Default Texture Pipeline
- Default Scene Assets Pipeline
- Default Scene Level Pipeline
- Default Graph Inspector Pipeline
これらのデフォルト パイプラインには、各タイプのインポートに最もよく使用されるオプションがそれぞれ含まれています。プロジェクトの特定のニーズに合わせて、これらのパイプラインをさらにカスタマイズすることができます。
既存のパイプラインを編集する
それぞれのデフォルト パイプラインは、プロジェクトやチームのニーズに合わせてカスタマイズすることができます。
以下は、プロジェクトに向けてインポート オプションをカスタマイズするための方法です。
- [Project Settings (プロジェクト設定)] で既存のパイプライン スタックを追加または削除したり、含まれるパイプラインの順序を変更したりする。
- デフォルトで使用されるパイプラインを変更する。
- 既存のデフォルト パイプラインを変更する。
- カスタム仕様のパイプラインを作成する。
プロジェクト設定を編集する
パイプライン スタックは [Project Settings (プロジェクト設定)] の [Engine (エンジン)] > [Interchange] にあります。
[Project Settings (プロジェクト設定)] にあるパイプライン スタック。
パイプライン スタックには以下のデフォルト設定が含まれています。
- Import Content (コンテンツをインポート)
- Import Into Level (レベルにインポート)
- エディタ インターフェース
- 全般
- エディタ汎用パイプライン クラス
Import Content (コンテンツをインポート)
Unreal Engine ではこれらの設定を使用して、コンテンツを コンテンツ ドロワー または コンテンツ ブラウザ にインポートします。
クリックしてフルサイズで表示。
表示されているコンテンツの各タイプに対して、設定をそれぞれ変更できます。また、必要に応じてセクションを追加することもできます。たとえば、デフォルトのコンフィギュレーションには Assets、Materials、Textures が含まれていますが、アニメーション (Animations) のための追加セクションをパイプライン スタックに加えて、受信するアニメーション ファイルを処理するカスタム仕様のパイプライン (複数可) を追加することができます。
Import Into Level (レベルにインポート)
エディタ ウィンドウのメイン メニューにある [File (ファイル)] > [Import Into Level (レベルにインポート)] オプションでは、エンジンへのコンテンツのインポート時にこれらの設定を使用します。デフォルトでは、連携してアクタ データをファイルからインポートし、レベル内にアクタをスポーンする 2 つのパイプラインが使用されます。
クリックしてフルサイズで表示。
- DefaultSceneAssetPipeline:DefaultAssetPipeline と同じクラスに基づいており、シーンのインポート向けに設計されています。
- DefaultSceneLevelPipeline:データが DefaultSceneAssetPipeline をパススルーした後に、ワールド内にアクタを生成します。
既存のデフォルト パイプラインを変更する
デフォルトの Interchange パイプラインのプロパティを調整して、以下を変更することができます。
- デフォルト値
- 可視性
- 読み取り専用ステータス
Interchange パイプラインの [Details (詳細)] パネル。
デフォルトの Interchange パイプラインの設定を変更するには、次のステップを実行します。
- コンテンツ ドロワーまたはコンテンツ ブラウザでデフォルトのパイプラインを見つけ、ダブルクリックして開きます。パイプラインは「Engine > Plugins >Interchange Framework Content > Pipelines」フォルダにあります。「Engine」フォルダが見当たらない場合は、コンテンツ ドロワー または コンテンツ ブラウザ の右上隅にある [Settings (設定)] をクリックし、[Show Engine Content (エンジンのコンテンツを表示)] チェックボックスをオンにします。
- 必要に応じて以下を編集します。
- インポートおよび再インポート プロセス中の可視性。
- デフォルト設定。
- インポート プロセス中にプロパティを読み取り専用にするかどうか。
- 保存してウィンドウを閉じます。
カスタム仕様のパイプラインを作成する
新しい Interchange パイプラインを作成して、ブループリント、C++、または Python を使ってインポート プロセスをさらにカスタマイズできます。
ブループリントを使用してカスタム仕様のパイプラインを作成する
ブループリントを使って新しい Interchange パイプラインを作成するには、次のステップを実行します。
InterchangePipelineBase を親クラスとして選択します。
- コンテンツ ドロワー または コンテンツ ブラウザ 内を右クリックして [Create Blueprint Class (ブループリント クラスを作成)] を選択します。
- [Pick Parent Class (親クラスを選択)] ウィンドウで [All Classes (すべてのクラス)] カテゴリを展開し、その親クラスとして InterchangePipelineBase を選択します。
この新しいブループリントをダブルクリックして ブループリント エディタ を開きます。ブループリントを使って作成したカスタム仕様のパイプラインには、カスタム仕様の動作を追加するためにオーバーライド可能な次の関数が含まれています。
Interchange のブループリント オーバーライド関数。
オーバーライド関数 | 説明 |
---|---|
Scripted Can Execute on Any Thread | このパイプラインが非同期モードで実行可能であることを Interchange Manager に伝えます。 |
Scripted Execute Export Pipeline | エクスポート プロセス中に実行します (現時点では機能しません)。 |
Scripted Execute Pipeline | ファイルの移動後に実行します。アセットの生成に必要なファクトリを作成します。 |
Scripted Execute Post Factory Pipeline | ファクトリでアセットが作成された後、PostEditChange 関数が呼び出される前に実行します。 |
Scripted Execute Post Import Pipeline | アセットが完全にインポートされて、PostEditChange 関数が呼び出された後に実行します。 |
Scripted Set Reimport Source Index | 再インポートするソース インデックスをパイプラインに伝えて実行します。この関数は、複数のソースが含まれる可能性のあるアセットの再インポート時に使用します。たとえば、ジオメトリのためのソース ファイルと、スキニング情報のためのソース ファイルが 1 つずつ含まれるスケルタルメッシュなどがあります。 |
C++ を使用してカスタム仕様のパイプラインを作成する
C++ を使って新しい Interchange パイプラインを作成するには、以下を含むヘッダ ファイルを作成します。
#pragma once
#include "CoreMinimal.h"
#include "InterchangePipelineBase.h"
#include "InterchangeSourceData.h"
#include "Nodes/InterchangeBaseNodeContainer.h"
#include "InterchangeMyPipeline.generated.h"
UCLASS(BlueprintType)
class INTERCHANGEPIPELINES_API UInterchangeMyPipeline : public UInterchangePipelineBase
{
GENERATED_BODY()
protected:
virtual void ExecutePipeline(UInterchangeBaseNodeContainer* BaseNodeContainer, const TArray<UInterchangeSourceData*>& SourceDatas) override;
virtual bool CanExecuteOnAnyThread(EInterchangePipelineTask PipelineTask) override
{
return true;
}
};
次に、以下を含むソース ファイルを作成します。
#include "InterchangeMyPipeline.h"
void UInterchangeMyPipeline::ExecutePipeline(UInterchangeBaseNodeContainer* NodeContainer, const TArray<UInterchangeSourceData*>& InSourceDatas)
{
Super::ExecutePipeline(NodeContainer, InSourceDatas);
// 移動したノードまたはファクトリ ノードに必要なロジックを含めます
}
Unreal Engine で C++ を使用する詳細については、「C++ プログラミング」を参照してください。
Python を使用してカスタム仕様のパイプラインを作成する
Python スクリプトを使って新しい Interchange パイプラインを作成するには、新しい Python スクリプトを作成し、それを [Project Settings (プロジェクト設定)] から スタートアップ スクリプト に追加します。Unreal Engine で Python スクリプトを使用する詳細については、「Python を使用した Unreal Editor のスクリプティング」を参照してください。
次の例では、Python スクリプトを使って基本的なアセット インポート パイプラインを作成します。
import unreal
@unreal.uclass()
class PythonPipelineTest(unreal.InterchangePythonPipelineBase):
import_static_meshes = unreal.uproperty(bool,meta=dict(Category="StaticMesh"))
import_skeletal_meshes = unreal.uproperty(bool,meta=dict(Category="SkeletalMesh"))
def cast(self, object_to_cast, object_class):
try:
return object_class.cast(object_to_cast)
except:
return None
def recursive_set_node_properties(self, base_node_container, node_unique_id):
node = base_node_container.get_node(node_unique_id)
# スタティックメッシュ ファクトリ ノードのステートを有効に設定します
static_mesh_node = self.cast(node, unreal.InterchangeStaticMeshFactoryNode)
if static_mesh_node:
static_mesh_node.set_enabled(self.import_static_meshes)
# スケルタルメッシュ ファクトリ ノードのステートを有効に設定します
skeletal_mesh_node = self.cast(node, unreal.InterchangeSkeletalMeshFactoryNode)
if skeletal_mesh_node:
skeletal_mesh_node.set_enabled(self.import_static_meshes)
# 子供をイテレートします
childrens = base_node_container.get_node_children_uids(node.get_unique_id())
for child_uid in childrens:
self.recursive_set_node_properties(base_node_container, child_uid)
@unreal.ufunction(override=True)
def scripted_execute_pipeline(self, base_node_container, SourceDatas):
root_nodes = base_node_container.get_roots()
for node_unique_id in root_nodes:
self.recursive_set_node_properties(base_node_container, node_unique_id)
return True